我一直在研究交换函数,以便最终使用x86程序集实现冒泡排序。
我的代码还包含一个函数,该函数可以在以后为另一个函数重构给定的数字(从-到+,反之亦然),在测试交换函数之前我已经调用了该函数
这是到目前为止的代码:
org 100h
jmp main
numToNeg dw -9
toSwap1 db 'a'
toSwap2 db 'b'
param1 equ 8
swap1 equ 12
swap2 equ 14
main:
push offset numToNeg
call refactor
mov ax,numToNeg
call print_num
PRINTN
PRINTN "Before Swap:"
mov al,toSwap1
Call print_al_chr ;This function prints the given char inside al
mov al,toSwap2
Call print_al_chr
push offset toSwap1
push offset toSwap2
call swap
PRINTN
PRINTN "After Swap:"
mov al,toSwap1
Call print_al_chr
mov al,toSwap2
Call print_al_chr
PROC refactor
push bp
push bx
push ax
mov bp,sp
mov bx,[bp + param1]
mov ax,[bx]
not ax
inc ax
mov [bx],ax
pop ax
pop bx
pop bp
retn 2
ENDP refactor
PROC swap
push bp
push ax
push cx
push bx
push di
mov di,[bp + swap1]
mov ax,[di]
mov bx,[bp + swap2]
mov cx,[bx]
mov [bx],ax
mov [di],cx
pop di
pop bx
pop cx
pop ax
pop bp
retn 4
ENDP swap
现在,我100%确定交换功能正确,因此问题出在我的主函数中,但是我自己无法弄清楚。当我调试代码时,堆栈对我来说还不错,我现在很沮丧:/
需要明确的是,函数“ print_al_chr”确实可以正常工作,并且该实现在我每次导入的另一个文件中。一开始我以为问题可能出在我一开始使用的“ equ”,但是我很确定自己传递的值确实正确,因为在函数中我要压入5个寄存器,总共需要10个字节的空间,因此参数应位于12和14位置。
谢谢:D
编辑:问题是我使用的是8位寄存器(AH和CL AX和CX的Instant和Instant)的16位寄存器,我也忘记像在重构函数中那样在函数开始时设置BP 。感谢大家的耐心和乐于助人:D