如何解决x86中stack重复声明问题?EMU8086报错排查
问题原因
错误根源是重复定义了名为stack的标识符:
- 你用
.stack 100h指令声明了8086系统自带的栈段,这个指令会隐式创建名为stack的段; - 同时又在
.data段里定义了stack db stack_size dup(?)的数组,两个stack重名,汇编器无法区分,所以抛出重复声明错误。
修复方案
把.data段里的自定义栈数组改名(比如改成my_stack),同时修正输出字符的功能号错误(原代码用mov ah,0调用int21h无效,需用ah=02h来输出字符)。修复后的完整代码如下:
.model small .stack 100h .data stack_size equ 5 my_stack db stack_size dup(?) ; 改名避免与系统栈重名 top db 0 count db 5 msg db 'Enter a number: $' newline db 0Ah, 0Dh, '$' .code mov ax, @data mov ds, ax mov cx, stack_size input_loop: lea dx, msg mov ah, 09h int 21h ; 显示输入提示 mov ah, 01h int 21h ; 读取用户输入字符 sub al, '0' ; ASCII转数字 mov [my_stack + top], al ; 压入自定义栈 inc top ; 栈顶指针上移 ; 输出换行 lea dx, newline mov ah, 09h int 21h loop input_loop ; 按LIFO顺序输出 mov cx, stack_size output_loop: dec top ; 栈顶指针下移 mov al, [my_stack + top] ; 从自定义栈弹出 ; 数字转ASCII并输出 add al, '0' mov dl, al mov ah, 02h ; 02h是DOS输出字符功能号 int 21h ; 输出换行 lea dx, newline mov ah, 09h int 21h loop output_loop mov ah, 4ch int 21h end
额外说明
.stack 100h是设置系统栈的大小,这个栈是CPU用来保存返回地址、寄存器值的,和你自己实现的自定义栈是两个独立的东西,不要混淆;- 你的自定义栈逻辑是正确的:输入时从数组起始位置向上存储,输出时从栈顶向下读取,完全符合LIFO后进先出的特性。
内容的提问来源于stack exchange,提问作者Ibrahim
相关产品推荐
相关产品推荐

