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

如何解决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
额外说明
  1. .stack 100h是设置系统栈的大小,这个栈是CPU用来保存返回地址、寄存器值的,和你自己实现的自定义栈是两个独立的东西,不要混淆;
  2. 你的自定义栈逻辑是正确的:输入时从数组起始位置向上存储,输出时从栈顶向下读取,完全符合LIFO后进先出的特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:17:24