x86程序集:即使实现正确,交换功能的输出也不正确

我一直在研究交换函数,以便最终使用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

gulen123 回答:x86程序集:即使实现正确,交换功能的输出也不正确

您在此功能中缺少mov bp,sp

PROC swap 
    push bp
    push ax
    push cx
    push bx
    push di

    mov di,[bp + swap1]

您为每个变量保留了一个字节:

    toSwap1 db 'a'
    toSwap2 db 'b'

但是随后您使用了16位字加载和存储:

    mov di,[bp + swap1]
    mov ax,[di]
    mov bx,[bp + swap2]
    mov cx,[bx]
    mov [bx],ax
    mov [di],cx

由于di指向 toSwap1 ,因此我在这里引用的最后一条指令将覆盖两个变量。 (如果您正确设置了bp,就会发生这种情况。)


您在 main 函数的末尾缺少程序终止调用:

main: 

    push offset numToNeg
    call refactor
[...]
    mov al,toSwap2
    Call print_al_chr

PROC refactor 

如果这确实适用于与86-DOS兼容的系统,则应在对 print_al_chr 的最后一次调用之后添加以下内容:

    mov ax,4C00h
    int 21h

另一个说明:堆栈帧变量的 param1 swap1 swap2 equ可能更接近这些使用它们的函数的定义位置。这样可以更轻松地验证它们是否正确。

本文链接:https://www.f2er.com/2998956.html

大家都在问