8086汇编栈与字符串匹配异常:输入正确内容却返回false的原因
问题分析与修正
核心问题:栈元素读取顺序完全错误
你调试时看到栈中取出的'W'是74h(对应字符't'),输入的'W'是57h,本质是你读取栈元素的顺序和入栈顺序完全反了:
- 入栈逻辑:你从字符串
A的最后一个有效字符t(索引5)开始,依次将t、i、b、b、a、W压入栈。此时栈内从栈顶到栈底的顺序是W→a→b→b→i→t(栈是后进先出结构,最后压入的W在栈顶)。 - 读取逻辑:你却将
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
相关产品推荐
相关产品推荐

