pushad & pushfd
来源:互联网 发布:手机淘宝在那取消退款 编辑:程序博客网 时间:2024/09/21 08:41
pushad: 将所有的32位通用寄存器压入堆栈
pusha:将所有的16位通用寄存器压入堆栈
pushfd:然后将32位标志寄存器EFLAGS压入堆栈
pushf::将的16位标志寄存器EFLAGS压入堆栈
popad:将所有的32位通用寄存器取出堆栈
popa:将所有的16位通用寄存器取出堆栈
popfd:将32位标志寄存器EFLAGS取出堆栈
popf:将16位标志寄存器EFLAGS取出堆栈
_asm pushad
_asm pushfd
// 处理代码
_asm popfd
_asm popad
&&**************************************************for xiao mai********************************************************&&
&&********************************************************************************************************************&&
函数调用之前pushad保存所有寄存器的值,然后在函数执行完成之后popad恢复寄存器的值。
例子:
_fun proc arg1,agr2
local @ret
pushad
执行具体的操作...
把结果赋值给@ret
popad
mov eax,@ret
ret
_fun endp
我认为最后的mov eax,@ret 在popad后面执行破坏了eax寄存器的原始状态,这个函数执行完毕eax寄存器的值和执行前的值不同。
不过在cdecl以及stdcall调用约定下,eax寄存器用于返回函数的返回值,因此是一定会被破坏的。
编译器会根据调用约定规定寄存器的使用方式,事先约定好了非易失性寄存器(non-volatile registers)和易失性寄存器。非易失性寄存器就是指在一次函数调用之后,该寄存器依然会保持原有的值,易失性寄存器自然就是在函数调用后可能会被改变的寄存器。
例如x64约定有16个通用寄存器以及16个供浮点数使用的XMM寄存器,其中rax、rcx、rdx、r8-r11,以及xmm0-xmm5是易失性寄存器,函数调用后其中的值可能会被改变,剩下的就是非易失性寄存器,函数需要在返回后保证其中的值不被改变。如果在函数内部需要用到这些非易失性寄存器,那么需要先push到栈里,在返回到caller前将其pop出来,以保证遵守约定,所以也有云:pushad是一种简单粗暴的保存方式。
- pushad & pushfd
- pushad和pushfd
- pushad
- PUSHAD
- PUSHAD PushA
- Error: no such instruction: `pushad'
- X86 PUSHF/PUSHFD/PUSHFQ 指令详解
- PUSHA/PUSHAD POPA/POPAD 指令详解
- 汇编命令学习 - PUSHA/PUSHAD - 压入所有通用寄存器
- 【Spring3】(1)初识Spring
- 生成二维码代码
- Oracle数据库order by排序之null值处理方法
- RequireJS Adding a Library
- 设置NavigationControl的字体和背景色
- pushad & pushfd
- NSString 常用方法
- easyui-datetimebox默认显示当前时间
- mac操作系统更新SVN版本与IDEA兼容
- js 标签事件写法
- writeToFile
- android开发中的权限与权限获取
- Ilist 与list的区别
- 超简单的首页广告轮播图