Linux pushf在nasm中的应用
我发现Linux pushf在nasm中的应用,linux,assembly,x86,nasm,Linux,Assembly,X86,Nasm,我发现pushf在我的代码中遵循aaa指令。 这个指令实际上是做什么的?在互联网上搜索后,它说它会推标志,但我不知道它会推哪个标志到堆栈上,以及我们如何访问它们 代码片段如下所示: mov al,[num1+esi] mov bl,[num2+esi] adc al,bl aaa pushf pushf将的内容推送到堆栈上。此寄存器包含您可能关心的所有标志。关于如何访问它,在它被推到堆栈上之后,它就在堆栈上了,所以你可以使用你通常使用的任何东西来访问堆栈上的东西 这个答案似乎没有告诉你多少新的
pushf
在我的代码中遵循aaa
指令。
这个指令实际上是做什么的?在互联网上搜索后,它说它会推标志,但我不知道它会推哪个标志到堆栈上,以及我们如何访问它们
代码片段如下所示:
mov al,[num1+esi]
mov bl,[num2+esi]
adc al,bl
aaa
pushf
pushf
将的内容推送到堆栈上。此寄存器包含您可能关心的所有标志。关于如何访问它,在它被推到堆栈上之后,它就在堆栈上了,所以你可以使用你通常使用的任何东西来访问堆栈上的东西
这个答案似乎没有告诉你多少新的东西,但这就是它的全部。没有魔法或任何奇怪的东西。
pushf
将内容推送到堆栈上。此寄存器包含您可能关心的所有标志。关于如何访问它,在它被推到堆栈上之后,它就在堆栈上了,所以你可以使用你通常使用的任何东西来访问堆栈上的东西
这个答案似乎没有告诉你多少新的东西,但这就是它的全部。没有魔法或任何奇怪的东西。它有效地推动标志,将其保存在堆栈上。我怀疑在
pushf
之后,会有一些指令,如或(甚至可能是或al,0x30
,用于将数字转换为ASCII),它会删除标志,然后使用popf
来恢复它们。如果需要执行可能改变进位标志的指令,则这类代码通常用于将进位标志传播到下一个循环迭代。您是否有可能添加两个包含数字的ASCII字符串?如果此代码使用的是pushf
或al,则0x30
popf
,然后将其更改为lea eax[eax+0x30]
甚至可以工作,因为它与将AL中的值转换为ASCII字符具有相同的效果,而无需实际修改标志(因此无需保存或还原标志),如果您不需要bl
的值来代替adc
,您应该能够替换mov bl[num2+esi]
adc-al,bl
使用adc-al,[num2+esi]
它推动标志有效地将它们保存在堆栈上。我怀疑在pushf
之后,会有一些指令,如或(甚至可能是或al,0x30
,用于将数字转换为ASCII),它会删除标志,然后使用popf
来恢复它们。如果需要执行可能改变进位标志的指令,则这类代码通常用于将进位标志传播到下一个循环迭代。您是否有可能添加两个包含数字的ASCII字符串?如果此代码使用的是pushf
或al,则0x30
popf
,然后将其更改为lea eax[eax+0x30]
甚至可以工作,因为它与将AL中的值转换为ASCII字符具有相同的效果,而无需实际修改标志(因此无需保存或还原标志),如果您不需要bl
的值来代替adc
,您应该能够替换mov bl[num2+esi]
adc-al,bl
与adc-al,[num2+esi]