您的位置:首页 > 其它

每日一课(2/75) 常用指令(传送 交换 取地址 取段 栈操作)

2008-02-13 12:16 381 查看
先写几个英文简写及含义。

reg - 寄存器

mem- 内存

lmm - 立即数



1. 传送指令MOV reg/mem reg/mem/lmm


传送指令,相当于高级语言的赋值语句,把源操作数(reg/mem/lmm)传送到前面的寄存器和内存地址中。

2. 传送填充指令MOVSX/MOVZX reg/mem reg/mem/lmm

传送填充指令,和MOV语句具有相同功能的基础上,对目的操作数的高位进行填充,又分为符号填充(MOVSX)和零(MOVZX)填充。

(1)符号填充指令:MOVSX

用源操作数的符号位填充目的操作数的高位数据位。

比如AL = 87H,则MOVSX CX AL指令执行之后 CX就是0FF87H

(2)零填充指令:MOVZX

用0来填充目的操作数的高位数据位。

比如AL = 87H,则MOVZX CX AL指令执行之后 CX就是0087H

3. 交换指令XCHG reg/mem reg/mem

交换指令XCHG是交换两个寄存器,寄存器和内存变量之间内容的指令,两个操作数的数据类型要相同。



4. 取有效地址指令LEA reg mem


是把一个内存变量的有效地址传送到寄存器中



5. 取段寄存器指令LDS/LES/LFS/LGS/LSS reg mem

LDS是把内存单元的一个“低字”传送到指定的寄存器,并把“高字”传送到段寄存器DS中。

LES,LFS,LGS,LSS是把高字传送到相应的段寄存器ES,FS,GS,SS中。

6. 栈操作指令

栈的实质是一块内存空间,栈的标准访问形式不同于一般的内存访问形式(用内存地址去访问),而是通过入栈(压栈)与出栈(弹栈)指令进行访问,且栈是后进先出的。(也可以用内存地址的形式去访问栈中的内容,但这属于特殊手段),以下就是栈操作指令

(1) 压栈指令:PUSH, PUSHA, PUSHAD

- PUSH reg/mem: 把寄存器和内存单元中的值压入栈中

- PUSHA: 依次把AX,CX,DX,BX,SP,BP,SI,DI等压入栈中

- PUSHAD: 依次把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI等压入栈中

(2) 弹栈指令:POP, POPA, POPAD

- POP reg/mem: 弹出栈首的值到指定的寄存器和内存单元中

- POPA: 把栈中的值依次弹到DI,SI,BP,SP,BX,DX,CX,AX等寄存器中

- POPAD: 把栈中的值依次弹到EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX等寄存器中

压栈与弹栈的补充说明:

ESP/SP寄存器始终指向栈首,所以在PUSH时,SP=SP-2或4, *SP = 操作数(C语法,就是SP寄存器先向前移动两位和四位,然后将值写入指向的内存区域),POP一个项的时候,操作数 = *SP, SP = SP+ 2或4

在16位操作系统使用SP,AX等寄存器,在32位操作系统则应该使用ESP,EAX系列的寄存器,在64位操作系统则可以使用RSP寄存器。


VC++编译器生成的汇编代码使用栈的时候,并不是按标准做法PUSH和POP,而是PUSH多个项目后,用ESP做为基址,向后偏移四位来寻找第二个项,直到访问结束后一次性的把栈清空,这样省略了多次弹栈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: