在我的x86 ASM教科书中,有一个example的宏,它在标准输出流中写入一个字符串:
%macro PRINT 1
pusha
pushf
jmp %%astr
%%str db %1, 0
%%strln equ $-%%str
%%astr: _syscall_write 1, %%str, %%strln
popf
popa
%endmacro
我无法理解的是为什么我们将所有通用寄存器值推送到堆栈或从堆栈中弹出? _syscall_write
不会修改任何寄存器,只会保存系统调用结果的EAX
。那么为什么我们不只是推送EAX
?会不会更有效率?