我正在寻找一种简单的方法,在组装程序中的普莎波帕。我想使用emu8086在我的程序中查找bug,所以不允许使用.286。我试过:
push_a proc
push ax
push cx
push dx
push bx
push sp
push bp
push si
push di
push_a endp
pop_a proc
pop di
pop si
pop bp
pop sp
pop bx
pop dx
pop cx
pop ax
pop_a endp但是它不起作用,因此,当我们“调用push_a”时,我们将一个地址推送到堆栈中。还有其他简单简单的方法吗?我不想每次写八推八弹。
发布于 2017-04-16 21:27:11
我正在寻找一种简单的方法,在组装程序中的普莎波帕。
和
我不想每次写八推八弹。
当您使用建议的宏解决方案时,这正是您要做的!每次使用宏的名称时,它所代表的整个代码块都会被替换。这真的是对空间的浪费。
尽管@MargaretBloom的回答很好地解释了push sp和pop sp的所有问题,但它并不能给出最简单的解决方案。此外,在保存和恢复所有通用寄存器的情况下,推送和弹出堆栈指针是一种愚蠢的操作。即使是制造商(英特尔)也知道这一点,并且在执行SP时巧妙地绕过了推送的popa值。SP寄存器被pusha推送,只是因为它简化了硬件设计。
最好的解决方案,然后满足需求,暂时删除从call push_a / call pop_a返回地址,然后推送/弹出7有用的GPRs。在执行ret之前,直接将返回地址放回堆栈中。哇哦。
push_a proc
pop word ptr [TEMP]
push ax
push cx
push dx
push bx
push bp
push si
push di
push word ptr [TEMP]
push_a endp
pop_a proc
pop word ptr [TEMP]
pop di
pop si
pop bp
pop bx
pop dx
pop cx
pop ax
push word ptr [TEMP]
pop_a endp此解决方案也不会更改其操作的任何标志。由“Fifoernik”观察。
这里有一个想法:为什么不把旗子保留为第八个寄存器呢?
最后一个音符。为了使这段代码非常健壮,您可以将这个临时变量放在程序的代码段中,并使用一个CS:覆盖前缀来解决它。当您需要使用新的DS / pop_a调用时,您的push_a段寄存器可能并不总是在正确的位置。您的CS寄存器本质上是正确的。如果不是这样的话,call甚至不会运行。
发布于 2017-03-23 09:30:52
pushuj MACRO
push ax
push cx
push dx
push bx
push sp
push bp
push si
push di
ENDM当我想叫它的时候,我会写:
pushuj我很好吗?
https://stackoverflow.com/questions/42971287
复制相似问题