汇编-寄存器及主要指令
寄存器
可以分为四类:
数据寄存器
EAX(Accumulator)
- 可用于乘除,输入输出等操作,他们的使用频率很高。EAX还通常用于存储函数的返回值。
EBX(Base Register)
- 作为存储器指针来使用,用来访问存储器。
ECX (Count Register)
- 在循环和字符串操作时,用来控制循环次数;在移多位时,要用CL来指明移位的位数。
EDX (Data Register)
- 在进行乘除运算时,作为默认操作数参与运算,也可用于存放I/O的端口地址。
地址寄存器:
- 变址(ESI,EDI)
- 分别作为“原地址指针”和“目的地址指针”
- 指针(ESP,EBP)
- 栈帧顶,栈帧底
- 变址(ESI,EDI)
段寄存器:ES CS SS DS FS GS
- 内存单元的物理地址,由段寄存器的值和一个偏移量组合,组成一个大的内存地址。
- CS:代码段
- DS:数据段
- ES:附加段
- SS:堆栈段
- FS:附加段
- GS 附加段
- 融合变址寄存器,在很多字符串操作指令中,DS:ESI指向源串,ES:EDI指向目标串。
指令寄存器 EIP(下一步执行的代码); 标志寄存器 EFlags
指令
- 数据传送指令:
- MOV 目的操作数,源操作数
- XCHG 寄存器A ,寄存器B 交换
- PUSH 寄存器,POP 寄存器 把寄存器的操作数压入堆栈或从堆栈取出到寄存器
- PUSHF,POPF (标志寄存器出入栈)
- PUSHA,POPA 这两个指令的作用是把通用寄存器压栈出栈。寄存器的入栈顺序依次是:EAX,ECX,EDX,EBX,ESP(初始值),EBP,ESI,EDI.出栈相反。
- LEA,LDS,LES 取地址到寄存器
- 位运算指令:
- ADN,OR,XOR,NOT,TEST
- SHR,SHL,SAR,,SAL 算数移动和逻辑移动
- ROR,ROL,RCR,RCL 循环位移
- 算数运算指令:
- ADD ADC 加法
- SUB SBB 减
- INC EDC 自增 自减
- NEG 自反
- MUL IMUL 乘
- DIV IDIV 除
- 流程控制指令
- CMP 比较op1与op2的值
- JMP 跳转指定地址
- LOOP 循环指令
- CALL RET 子程序点用,返回
- INT IRET中断调用及返回
- REP REPE REPNE 重复前缀指令
- 条件转移命令
- JXX:当特定条件成立则跳往指定地址
- Z为0
- G大于
- L小于
- E等于
- N相反
- JXX:当特定条件成立则跳往指定地址
- 字符串操作指令集
- MOVSB MOVSW MOVSD字符串传送指令(B字节,W字,D双字)
- CMPSB CMPSW CMPSD 字符串比较指令
- SCASB,SCASW字符串搜索指令
- LODSB,LODSW,STOSB,STOSW字符串载入或驻存指令
一个程序调用的例子
C语言程序
1 |
|
汇编
一个例子:
- main
1 |
|
- add(int x,int y)
1 |
|