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

8086汇编:通过引用交换变量函数报错求助(CMP指令参数错误)

问题解决与代码修正

错误分析

  1. 指令语法违规:CMP [ax], [bx]不符合8086汇编规则——8086不支持两个内存操作数直接进行比较或运算,必须将其中一个操作数先加载到通用寄存器中。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:05:32