与推送功能相同的指令序列

2024-01-02

我想知道是否有可能(如果可以,如何)编写一系列具有相同效果的指令push。例如,如果内容ax是1200,我做了一个push ax,我还可以使用哪些其他指令来完成什么push ax does?


其他一些答案使用[sp]用于堆栈寻址,但在 16 位模式下不可能,在 32 位或 64 位模式下也不可能。但是,在 32 位模式下您可以使用[esp]在 x86-64 中你可以使用[rsp]用于内存寻址,但在 16 位模式下,没有使用的内存寻址sp. See here http://sandpile.org/x86/opc_rm16.htm了解 16 位模式下可能的存储器寻址模式。

所以,你需要做的是:存储bp某处,复制sp into bp,然后使用bp进行栈寻址,最后恢复原来的值bp.

如果你有地方可以存放bp,这很简单(这是 YASM/NASM 语法):

mov [bp_storage], bp
sub sp,2
mov bp,sp
mov [bp],ax
mov bp,[bp_storage]

...

bp_storage dw 0

使用寄存器代替内存地址,例如bp_storage这也是微不足道的。

Edit:添加了不修改标志的版本(如下),如下push也不修改标志。

上面的代码修改了标志,而push ax不修改任何标志。可以通过先存储来解决ah到内存中,然后将标志加载到ah with lahf,然后存储来自ah到内存,然后如上所述修改堆栈,然后通过以下方式从内存恢复标志ah通过使用sahf并最终恢复ah从记忆里。

Edit:模拟push ax不改变标志,ah之前必须保存lahf并在之前加载mov [bp],ax. Fixed.

mov [ah_storage],ah
lahf
mov [flags_storage],ah
mov [bp_storage],bp
sub sp,2
mov bp,sp
mov ah,[ah_storage]
mov [bp],ax
mov bp,[bp_storage]
mov ah,[flags_storage]
sahf
mov ah,[ah_storage]

...

bp_storage    dw 0
ah_storage    db 0
flags_storage db 0

sub http://web.itu.edu.tr/kesgin/mul06/intel/instr/sub.html修改AF, CF, OF, PF, SF, ZF, 然而lahf http://web.itu.edu.tr/kesgin/mul06/intel/instr/lahf.html负载和sahf http://web.itu.edu.tr/kesgin/mul06/intel/instr/sahf.html仅限商店AF, CF, PF, SF, ZF (no OF)。然而,sp在正常的堆栈使用中永远不应该溢出。

但是,如果你无法访问内存,并且想使用堆栈来存储bp你可以这样做,但如果你没有可用的免费寄存器,事情就会变得复杂。但如果您使用的是实模式操作系统,则可以使用以下命令阻止中断cli, 交换bp and sp, use bp用于堆栈寻址、交换bp and sp再次并允许再次中断sti.

Edit:的价值sp需要减去2来模拟push ax。固定的。该版本不修改标志(中断标志除外)。

cli
xchg bp,sp
lea bp,[bp-2]
mov [bp],ax
xchg bp,sp
sti
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与推送功能相同的指令序列 的相关文章

随机推荐