我需要创建一个函数,通过引用交换两个变量(传输值应该在堆栈上,而不是通过寄存器),当我尝试检查交换的值时,我有一个错误(在emu8086上):(11)参数错误:CMP [ax],[bx](11)可能是一个未定义的变量:[斧头]
org 100h
include print.inc ;printing library
start:
x db 0x7Fh
y db 0x80h
lea ax, x ;get address
lea bx, y ;get address
push ax
push bx
call swap
cmp [ax], [bx]
jl label1;check if values swapped
jmp end2
label1:
PRINTN "values swapped" ;print if the values swapped
end2:
mov ah, 0
int 16h
ret
proc swap ;swap function
push bp
mov bp, sp
mov cx, [bp + 4]
xchg cx, [bp + 6]
mov [bp + 4], cx
jmp end1
end1:
pop bp
ret
endp swap
1条答案
按热度按时间64jmpszr1#
我猜您正在尝试实现经典的C交换:
所以我会一步一步地分解需要做的事情。首先,你在
start
标签后面定义数据,然后在后面编写代码。除非这里有额外的硬件抽象,否则CPU会把0x7F
和0x80
解释为CPU指令,谁知道会做什么。所以把你声明的数据移到不同的部分。我喜欢这样的注解来提醒自己哪个变量是哪个变量,因为事情很快就会变得混乱。
现在,你必须记住,因为你使用
LEA
来填充ax
和bx
,所以你在这些寄存器中拥有的是指向内存的指针。所以ax
并不等于0x007F
,而是 *0x007F
存储的地址。* 所以你需要在从堆栈中加载参数后解引用它们。