-1
    mov al,12
    mov ah,00
    mov cl,0
    convertBinary:
        cmp al,0
        je printBinary

        div two
        push ax
        inc cl

        mov ah,00
        jmp convertBinary

        printBinary:
            pop ax
            mov dl,ah
            add dl,48
            mov ah,02h
            int 21h
            loop printBinary

此代码无需过程即可正常工作。当我将相同的代码放在一个过程中并调用它时,由于非法指令,它会说错误。有人请解释一下为什么我们不能在程序中使用那些推送和弹出。

4

2 回答 2

2

与编译器不同,汇编器对整个文件没有整体语法,只有单独的行。因此,汇编器甚至不关心您是否在“过程中”——名称convertBinaryprintBinary只是它可以计算从和指令的相对地址jmp的符号loopcall

因此,无论您在什么“上下文”中,无论您是否在过程中,汇编器都应该发出相同的操作码(不考虑改变默认操作大小的汇编器指令)。我假设您在运行时收到非法指令,而不是在组装程序时?

仔细检查您的代码旁边是否没有任何数据被溢出并在运行时覆盖代码,并且您没有丢失任何必要的控制流(ret在过程结束时丢失或丢失代码例如退出程序)。

还要仔细检查您是否push对每个相应的pop. 仅仅因为每条指令在代码中出现的次数相同,并不意味着每条指令都pushpop执行相同的次数。

于 2013-07-06T02:06:20.523 回答
2

您的代码将在某些输入状态下正常工作,而在其他输入状态下会变得疯狂。如果它在一个过程中变得疯狂,如果它没有首先因堆栈错误而终止,它将执行一个疯狂的跳转。

运行整个程序(除了最后的终止调用)将避免疯狂跳转,尽管错误的输入仍会产生错误的输出。

非常仔细地查看您的循环。它不会像你想的那样做。

编辑:mbratch 还提出了另一个我错过的失败案例。

于 2013-07-06T02:06:33.483 回答