assembly 在程序集8086中通过引用在两个变量之间交换

qnakjoqk  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(142)

我需要创建一个函数,通过引用交换两个变量(传输值应该在堆栈上,而不是通过寄存器),当我尝试检查交换的值时,我有一个错误(在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
64jmpszr

64jmpszr1#

我猜您正在尝试实现经典的C交换:

void swap(int* a, int* b)
{ 
int temp = *a;
*a = *b;
*b = temp;
}

所以我会一步一步地分解需要做的事情。首先,你在start标签后面定义数据,然后在后面编写代码。除非这里有额外的硬件抽象,否则CPU会把0x7F0x80解释为CPU指令,谁知道会做什么。所以把你声明的数据移到不同的部分。

proc swap   ;swap function
    push bp
    mov bp, sp
;sp + 0 = bp
;sp + 2 = ret
;sp + 4 = pushed bx
;sp + 6 = pushed ax

我喜欢这样的注解来提醒自己哪个变量是哪个变量,因为事情很快就会变得混乱。
现在,你必须记住,因为你使用LEA来填充axbx,所以你在这些寄存器中拥有的是指向内存的指针。所以ax并不等于0x007F,而是 * 0x007F存储的地址。* 所以你需要在从堆栈中加载参数后解引用它们。

proc swap   ;swap function
    push bp
    mov bp, sp
;sp + 0 = bp
;sp + 2 = ret
;sp + 4 = pushed bx
;sp + 6 = pushed ax
    mov di,[bp + 4] ;loads &y into di
    mov si,[bp + 6] ;loads &x into si
    mov ax,[di]     ;loads 0x0080 into ax
    mov cx,[si]     ;loads 0x007F into cx

;now swap the values at those addresses

    mov [si],ax     ;*a = 0x0080
    mov [di],cx     ;*b = 0x007F
    pop bp
    ret
endp swap

相关问题