为何这段汇编代码在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
额外说明
- DOS中断
01h读取的是输入字符的ASCII码(比如输入'3'实际存储的是0x33),由于数字字符的ASCII码顺序与实际数值顺序一致,所以直接比较num1和num2的逻辑是有效的。 - 若需要处理数值而非ASCII字符,可在读取后执行
sub al, 30h将ASCII码转换为对应数值,输出前再执行add dl, 30h转换回ASCII码。
内容的提问来源于stack exchange,提问作者andrei
相关产品推荐
相关产品推荐

