汇编指令(一)
1.MOV(传送)
指令写法:MOV target,source
注意事项:
1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。
2)target和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)
3)不能将立即数传送给段寄存器
4)target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。
5)由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target数的位数相同,再进行传送。有时,需要用BYTE PTR 、WORD PTR、 DWORD PTR明确指出立即数的位数
写法示例:
MOV dl,01H;
MOV eax,[bp]; //eax =ss:[bp] 双字传送
地址计算
bx、si和ds配合适用;di和es配合使用;bp和ss配合使用。
MOV AX,[BX];
算法:DS10H+BX默认段寄存器DS
b\w\l\q -> 8\16\32\64
movl %eax,%edx //edx = eax
movl $0x123,%edx //edx = 0x123
movl 0x123, %edx //edx = (0x123)
movl 4(%ebx),%edx //edx = (ebx+4)
AT&T汇编格式(linux内核)与Intel汇编格式不一样
2、XCHG(交换)
指令写法:XCHG object1,object2
功能描述:交换object1与object2的值
注意事项:
1)不能直接交换两个内存数的值
2)类型必须匹配
3)两个操作数任何一个都不能是段寄存器【看来段寄存器的写入的限制非常的严格,MOV指令也不能对段寄存器进行写入】
4)必须是通用寄存器(ax、bx、cx、dx、si、di)或内存数
写法示例:
XCHG ax,bx;
XCHG ax,bx;
3、LEA(装入有效地址)
指令写法:LEA reg16,mem
功能描述:将有效地址MEM的值装入到16位的通用寄存器中。
lea是load effective address 的缩写,是取源操作数的偏移地址,并将其传送到目的操作数单元。类似于C语言的取地址符&。
1.lea指令获取偏移地址
mov byte ptr ds:[98H],12h;//byte大小的数据12h存入内存
lea bx,ds:[98H];//bx=98H,数据偏移地址
2.实现普通的算术操作
lea edx,[ecx+eax*4] ,就是说把ecx+eax*4算出来直接把结果传递给edx
4、简单加减指令
ADD 加法指令 ADD DEST,SRC DEST<=DEST SRC 两数相加
SUB 减法指令 SUB DEST,SRC DEST<=DEST-SRC 两数相减
INC 加1指令 INC DEST DEST<=DEST 1
DEC 减1指令 DEC DEST DEST<=DEST-1
NEG 取补指令 NEG OPRD OPRD=0-OPRD 对操作数取补(相反数)
ADC(add with carry) 带进位加法指令
ADC DEST,SRC DEST<=DEST SRC CF
SBB(substraction with borrow) 带借位减法
SBB DEST,SRC DEST<=DEST-(SRC CF)
5、状态标志操作指令
CLC(clear carry flag)
清进位标志指令 CLC 使进位标志CF为0
STC(set carry flag)
置进位标志指令 STC 使进位标志CF为1
CMC(complement carry flag)
进位标志取反指令 CMC 使进位标志CF取反
LAHF(load status flags into AH register)
获取状态标志操作指令 LAHF 把位于标志寄存器低端的5个状态标志位信息同时送到寄存器AH的对应位
SAHF(store AH into Flags) 设置状态标志操作指令 SAHF 对标志寄存器中的低8位产生影响,使得状态标志位SF、ZF、AF、PF和CF分别成为来自寄存器AH中对应位的值,但保留位(位1、位3、位5)不受影响
6、过程调用和返回指令
CALL 过程调用指令 CALL LABEL 段内直接调用LABEL
与jmp的区别在于call指令会在调用label之前保存返回地址(call 中return之后主程序还可以继续执行,jmp 当label执行完毕后不能返回主程序继续执行)
RET 段内过程返回指令 RET 使子程序结束,继续执行主程序
7、符号拓展指令
CBW 字节转化为字指令 CBW 把寄存器AL中的值符号拓展到寄存器AH
CWD 字转化为双字指令 CWD 把寄存器AX中的值符号拓展到寄存器DX
CDQ 双字转化为四字指令 CDQ 把寄存器EAX中的值符号拓展到EDX
CWDE 字转化为双字指令 CWDE 把AX中的值符号拓展到EAX的高16位
8、一般移位指令
SAL 算术左移 SAL OPRD,count
把操作数oprd左移count位,右边补0 与shl指令一样
通过截取count的低5位,实际的移位数被限于0到31之间。
SHL 逻辑左移 SHL OPRD,count
把操作数oprd左移count位,右边补0 与sal指令一样
通过截取count的低5位,实际的移位数被限于0到31之间。
SAR 算术右移 SAR OPRD,count
把操作数oprd右移count位,同时每右移一位,左边补符号位,移出的最低位进入标志位CF 通过截取count的低5位,实际的移位数被限于0到31之间。
SHR 逻辑右移 SHR OPRD,count
把操作数oprd右移count位,左边补0,移出的最低位进入标志位CF 通过截取count的低5位,实际的移位数被限于0到31之间。

浙公网安备 33010602011771号