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

为何这段汇编代码在DOSBox中无法运行?如何修复?

汇编代码错误分析与修复方案

错误原因

你遇到的编译错误,核心问题是x86汇编的MOV指令不支持直接在两个内存单元之间传输数据,必须通过寄存器作为中转。代码中mov max, num2、mov max, num1这类直接操作两个内存变量的写法,违反了x86指令集的规则,因此被汇编器报错。

修复方案

把所有内存到内存的MOV操作,拆分为“内存→寄存器”和“寄存器→内存”两步,使用8位寄存器(比如al)作为中转。修复后的完整代码如下:

.model small
.stack 100h
.data
num1 db 3
num2 db 5
max db 0
.code
start:
    mov ax, @data
    mov ds, ax

    mov ah, 01h
    int 21h
    mov num1, al

    mov ah, 01h
    int 21h
    mov num2, al

    cmp num1, num2
    jg greater
    ; 修复内存到内存的非法操作
    mov al, num2
    mov max, al
    jmp done
greater:
    ; 修复内存到内存的非法操作
    mov al, num1
    mov max, al
done:
    mov dl, max
    mov ah, 02h
    int 21h

    mov ax, 4c00h
    int 21h
end start

额外说明

  1. DOS中断01h读取的是输入字符的ASCII码(比如输入'3'实际存储的是0x33),由于数字字符的ASCII码顺序与实际数值顺序一致,所以直接比较num1和num2的逻辑是有效的。
  2. 若需要处理数值而非ASCII字符,可在读取后执行sub al, 30h将ASCII码转换为对应数值,输出前再执行add dl, 30h转换回ASCII码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:20:33