You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8086汇编栈与字符串匹配异常:输入正确内容却返回false的原因

问题分析与修正

核心问题:栈元素读取顺序完全错误

你调试时看到栈中取出的'W'是74h(对应字符't'),输入的'W'是57h,本质是你读取栈元素的顺序和入栈顺序完全反了:

  1. 入栈逻辑:你从字符串A的最后一个有效字符t(索引5)开始,依次将t、i、b、b、a、W压入栈。此时栈内从栈顶到栈底的顺序是W→a→b→b→i→t(栈是后进先出结构,最后压入的W在栈顶)。
  2. 读取逻辑:你却将bp初始化为sp+12(回到栈的初始pile位置),然后每次sub bp,2读取最早压入的t、i、b...,第一个对比的就是t和输入的W,自然不匹配。

其他错误点

  • 栈初始化错误:8086栈从高地址向低地址生长,mov sp,pile把sp指向栈的底部,第一次push会覆盖栈的初始数据,正确做法是将sp指向栈顶(比如mov sp, offset stack_top,或者直接mov sp, 256,因为栈段定义了128个dw,共256字节)。
  • 长度校验缺失:没有先判断输入字符串长度是否等于6("Wabbit"的长度),如果输入长度不对,直接应该返回false。
  • 代码结构错误:退出指令mov ax,4c00h; int 21h被放在code segment的ends之后,永远不会执行,程序会在显示结果后异常退出。

修正后的代码

data segment
     S db 20 dup('$')   ; 输入缓冲区:S[0]是最大长度,S[1]是实际长度,S[2...]是输入字符
     T db 'true$'
     F db 'false$'
     A db 'Wabbit$'     ; 预存字符串,有效字符是前6个:W,a,b,b,i,t
ends

stack segment
    dw 128 dup(0)
    stack_top:          ; 标记栈顶位置
ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; 读取用户输入
    mov dx, offset S
    mov ah, 10
    int 21h

    ; 校验输入长度是否为6,否则直接返回false
    cmp S[1], 6
    jne exit

    ; 初始化栈指针到栈顶
    mov ax, stack
    mov ss, ax
    mov sp, offset stack_top

    ; 将"Wabbit"按t→i→b→b→a→W的顺序压栈,栈顶最终是W
    mov si, 5
for1:
    mov al, A[si]
    mov ah, 0
    push ax
    dec si
    cmp si, 0
    jge for1

    ; 开始匹配:栈顶到栈底是W→a→b→b→i→t,对应输入的S[2]→S[7]
    mov bp, sp
    mov si, 2
    mov cx, 6
match_loop:
    mov bx, [bp]        ; 取栈顶的字符(先取W)
    mov al, S[si]
    mov ah, 0
    cmp bx, ax
    jne exit            ; 不匹配跳转到false
    inc si
    add bp, 2           ; 移动到栈的下一个字符
    loop match_loop

    ; 匹配成功,显示true
    mov dx, offset T
    mov ah, 9
    int 21h
    jmp program_exit

exit:
    ; 匹配失败,显示false
    mov dx, offset F
    mov ah, 9
    int 21h

program_exit:
    ; 正确退出程序
    mov ax, 4c00h
    int 21h
ends
end start

内容的提问来源于stack exchange,提问作者alaa albast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:17:06