8086汇编:通过引用交换变量函数报错求助(CMP指令参数错误)
问题解决与代码修正
错误分析
- 指令语法违规:
CMP [ax], [bx]不符合8086汇编规则——8086不支持两个内存操作数直接进行比较或运算,必须将其中一个操作数先加载到通用寄存器中。 - swap函数逻辑错误:当前swap函数仅交换了栈中存储的两个变量地址,并未通过地址访问并交换
x和y的实际值,完全没达到引用交换变量的目的。
修正后的代码
org 100h include print.inc ;printing library start: x db 0x7Fh y db 0x80h lea ax, x ;获取x的地址 lea bx, y ;获取y的地址 push ax push bx call swap ; 修正比较指令:先将内存值加载到寄存器再比较 mov al, [ax] cmp al, [bx] jg label1 ; 交换后x值(0x80)大于y值(0x7F),用jg判断才正确 jmp end2 label1: PRINTN "values swapped" ;交换成功时打印 end2: mov ah, 0 int 16h ret proc swap ;引用交换变量的函数 push bp mov bp, sp ; 从栈中取出两个变量的地址 mov si, [bp + 4] ; 第一个入栈参数:y的地址 mov di, [bp + 6] ; 第二个入栈参数:x的地址 ; 读取变量值到寄存器并交换写回 mov al, [si] xchg al, [di] mov [si], al pop bp ret 4 ; 压入了两个16位参数,ret 4自动弹出参数平衡栈 endp swap
关键修改说明
- 比较指令修正:将
CMP [ax], [bx]改为先把内存值加载到寄存器al,再执行cmp al, [bx],符合8086指令集要求。 - swap函数逻辑修复:通过栈取出变量地址后,访问地址对应的内存值,交换后写回内存,真正实现引用交换变量的功能。同时用
ret 4替代普通ret,自动清理栈中压入的两个16位参数,避免栈泄漏。 - 判断逻辑修正:原代码
jl label1的判断逻辑与交换结果不符,交换后x的值大于y,改为jg label1才能正确触发成功提示。
内容的提问来源于stack exchange,提问作者AyAm
相关产品推荐
相关产品推荐

