首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emu8086普莎·波帕

Emu8086普莎·波帕
EN

Stack Overflow用户
提问于 2017-03-23 08:57:29
回答 2查看 1.8K关注 0票数 1

我正在寻找一种简单的方法,在组装程序中的普莎波帕。我想使用emu8086在我的程序中查找bug,所以不允许使用.286。我试过:

代码语言:javascript
复制
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”时,我们将一个地址推送到堆栈中。还有其他简单简单的方法吗?我不想每次写八推八弹。

EN

回答 2

Stack Overflow用户

发布于 2017-04-16 21:27:11

我正在寻找一种简单的方法,在组装程序中的普莎波帕。

我不想每次写八推八弹。

当您使用建议的宏解决方案时,这正是您要做的!每次使用宏的名称时,它所代表的整个代码块都会被替换。这真的是对空间的浪费。

尽管@MargaretBloom的回答很好地解释了push sppop sp的所有问题,但它并不能给出最简单的解决方案。此外,在保存和恢复所有通用寄存器的情况下,推送和弹出堆栈指针是一种愚蠢的操作。即使是制造商(英特尔)也知道这一点,并且在执行SP时巧妙地绕过了推送的popa值。SP寄存器被pusha推送,只是因为它简化了硬件设计。

最好的解决方案,然后满足需求,暂时删除从call push_a / call pop_a返回地址,然后推送/弹出7有用的GPRs。在执行ret之前,直接将返回地址放回堆栈中。哇哦。

代码语言:javascript
复制
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甚至不会运行。

票数 0
EN

Stack Overflow用户

发布于 2017-03-23 09:30:52

代码语言:javascript
复制
pushuj    MACRO  
    push ax
    push cx
    push dx
    push bx
    push sp
    push bp
    push si
    push di

ENDM

当我想叫它的时候,我会写:

代码语言:javascript
复制
pushuj

我很好吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42971287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档