第十五课_几条汇编指令

前言

上一节说了,内存的读写。这样就可以讲几条汇编指令了。mov、addsubandorxornot7条汇编指令,会把每条指令的使用范围说清楚,可能比较枯燥。

先说明几个标记符号吧。只是为了后面方便写。

r:通用寄存器(register

m:内存(memory

imm:立即数(immediate

r、mimm这三个后面加数字,那么这个数字表示多少位。例如:r8:表示8位的寄存器。m32:表示32位的内存。imm16:表示16位的立即数。

 

mov指令

mov指令之前就有说过了,不过那里讲得比较粗糙,也就给了一个语句:mov 目标操作数,源操作数。也没怎么细讲。mov可以这么理解:复制源操作数到目标操作数中。因为目标操作数要记录数据,所以目标操作数不能是立即数。以下是mov指令的一些注意点:

1、源操作数可以是立即数、通用寄存器、段寄存器、内存。

2、目标操作数可以是通用寄存器、段寄存器、内存。

3、目标操作数和源操作数的宽度必须一样。

4、目标操作数和源操作数不能同时为内存。

mov指令可以有的语法:

1、mov r8/m8,r8

8位的寄存器复制到8位的寄存器或者8位的内存。

例子1:mov ah,dl

例子2:mov byte ptr ds:[0x 13ffc8],dl

2、mov r16/m16,r16

16位的寄存器复制到16位的寄存器或者16位的内存。

例子1:mov ax,cx

例子2:mov word ptr ds:[0x 13ffc8],cx

3、mov r32/m32,r32

32位的寄存器复制到32位的寄存器或者32位的内存。

例子1:mov eax,ecx

例子2:mov dword ptr ds:[0x13ffc8],ecx

4、mov r8,r8/m8

8位的内存或8位寄存器复制到8位的寄存器

例子1:mov byte ptr ds:[0x13ffc8],al

例子2:mov ah,al

5、mov r16,r16/m16

16位的内存或16位寄存器复制到16位的寄存器

例子1:mov word ptr ds:[0x13ffc8],ax

例子2:mov cx,ax

6、mov r32,r32/m32

32位的内存或32位寄存器复制到32位的寄存器

例子1:mov dword ptr ds:[0x13ffc8],eax

例子2:mov ecx,eax

7、mov r8,imm8

8位的立即数复制到8位的寄存器

例子:mov al,0x52

8、mov r16,imm16

16位的立即数复制到16位的寄存器

例子:mov ax,0x5201

9、mov r32,imm32

32位的立即数复制到32位的寄存器

例子:mov eax,0x52013140

 

add指令

add是加法指令。可以这么理解:add A,B -> 可以看成是A = A + B,即加法运算结束后会把相加的结果,保存到add后面的第一个操作数中。

注意点:前后两个操作数不能同时为内存。add后面的第一个操作数不能为立即数。

add指令可以有的情况:

1、add r8/m8,imm8

8位的寄存器或8位的内存与8位的立即数相加

例子1:add al,0x11

例子2:add byte ptr ds:[0x13ffc8],0x11

2、add r16/m16,imm16

16位的寄存器或16位的内存与16位的立即数相加

例子1:add ax,0x1111

例子2:add word ptr ds:[0x13ffc8],0x1111

3、add r32/m32,imm32

32位的寄存器或32位的内存与32位的立即数相加

例子1:add eax,0x11111111

例子2:add dword ptr ds:[0x13ffc8],0x11111111

4、add r8/m8,r8

8位寄存器或8位内存与8位寄存器相加

例子1:add al,ah

例子2:add byte ptr ds:[0x13ffc8],ah

5、add r16/m16,r16

16位寄存器或16位内存与16位寄存器相加

例子1:add ax,cx

例子2:add word ptr ds:[0x13ffc8],cx

6、add r32/m32,r32

32位寄存器或32位内存与32位寄存器相加

例子1:add eax,ecx

例子2:add dword ptr ds:[0x13ffc8],ecx

7、add r8,m8

8位寄存器与8位内存相加

例子:add ah,byte ptr ds:[0x13ffc8]

8、add r16,m16

16位寄存器与16位内存相加

例子:add ax,word ptr ds:[0x13ffc8]

9、add r32,m32

32位寄存器与32位内存相加

例子:add eax,dword ptr ds:[0x13ffc8]

sub指令

sub是减法指令。可以这么理解:sub A,B -> A = A - B,最后的结果保存在A中,所以A不能是立即数。AB两个操作数不能同时为内存。

sub指令可以有的情况:

1、sub r8/m8,imm8

8位寄存器或8位内存与8位的立即数相减

例子1:sub al,0x11

例子2:sub byte ptr ds:[0x13ffc8],0x11

2、sub r16/m16,imm16

16位寄存器或16位内存与16位的立即数相减

例子1:sub ax,0x1111

例子2:sub word ptr ds:[0x13ffc8],0x1111

3、sub r32/m32,imm32

32位寄存器或32位内存与32位的立即数相减

例子1:sub eax,0x11111111

例子2:sub dword ptr ds:[0x13ffc8],0x11111111

4、sub r8/m8,r8

8位寄存器或8位内存与8位寄存器相减

例子1:sub al,ah

例子2:sub byte ptr ds:[0x13ffc8],ah

5、sub r16/m16,r16

16位寄存器或16位内存与16位寄存器相减

例子1:sub ax,cx

例子2:sub word ptr ds:[0x13ffc8],cx

6、sub r32/m32,r32

32位寄存器或32位内存与32位寄存器相减

例子1:sub eax,ecx

例子2:sub dword ptr ds:[0x13ffc8],ecx

7、sub r8,m8

8位的寄存器与8位的内存相减

例子:sub ah,byte ptr ds:[0x13ffc8]

8、sub r16,m16

16位的寄存器与16位的内存相减

例子:sub ax,word ptr ds:[0x13ffc8]

9、sub r32,m32

32位的寄存器与32位的内存相减

例子:sub eax,dword ptr ds:[0x13ffc8]

and指令

and是逻辑与指令,与、或、非,异或,这几个逻辑操作之前讲过就不细说了。and指令可以这么理解:and A,B -> A = A and B,因为最后一结果保存到A中,所以A不能是立即数。当然AB不能同时为内存。

and可以有的情况:

1、and r8/m8,imm8

8位寄存器或8位内存与8位的立即数相与

例子1:and al,0x11

例子2:and byte ptr ds:[0x13ffc8],0x11

2、and r16/m16,imm16

16位寄存器或16位内存与16位的立即数相与

例子1:and ax,0x1111

例子2:and word ptr ds:[0x13ffc8],0x1111

3、and r32/m32,imm32

32位寄存器或32位内存与32位的立即数相与

例子1:and eax,0x11111111

例子2:and dword ptr ds:[0x13ffc8],0x11111111

4、and r8/m8,r8

8位的寄存器或8位的内存与8位的寄存器相与

例子1:and al,ah

例子2:add byte ptr ds:[0x13ffc8],ah

5、and r16/m16,r16

16位的寄存器或16位的内存与16位的寄存器相与

例子1:add ax,cx

例子2:add word ptr ds:[0x13ffc8],cx

6、and r32/m32,r32

32位的寄存器或32位的内存与32位的寄存器相与

例子1:and eax,ecx

例子2:add dword ptr ds:[0x13ffc8],ecx

7、and r8,m8

8位的寄存器与8位的内存相与

例子:add ah,byte ptr ds:[0x13ffc8]

8、and r16,m16

16位的寄存器与16位的内存相与

例子:and ax,word ptr ds:[0x13ffc8]

9、and r32,m32

32位的寄存器与32位的内存相与

例子:and eax,dword ptr ds:[ox13ffc8]

 

or指令

or是或指令,即有1,或的结果是1or指令可以这么理解:or A,B -> A = A or B,所以A不能是立即数。当然AB不能同时为内存。

or指令可以有的情况:

1、or r8/m8,imm8

8位寄存器或8位内存与8位的立即数相或

例子1:or al,0x11

例子2:or byte ptr ds:[0x13ffc8],0x11

2、or r16/m16,imm16

16位寄存器或16位内存与16位的立即数相或

例子1:or ax,0x1111

例子2:or word ptr ds:[0x13ffc8],0x1111

3、or r32/m32,imm32

32位寄存器或32位内存与32位的立即数相或

例子1:or eax,0x11111111

例子2:or dword ptr ds:[0x13ffc8],0x11111111

4、or r8/m8,r8

8位的寄存器或8位的内存与8位的寄存器相或

例子1:or al,ah

例子2:or byte ptr ds:[0x13ffc8],ah

5、or r16/m16,r16

16位的寄存器或16位的内存与16位的寄存器相或

例子1:or ax,cx

例子2:or word ptr ds:[0x13ffc8],cx

6、or r32/m32,r32

32位的寄存器或32位的内存与32位的寄存器相或

例子1:or eax,ecx

例子2:or dword ptr ds:[0x13ffc8],ecx

7、or r8,m8

8位的寄存器与8位的内存相或

例子:or ah,byte ptr ds:[0x13ffc8]

8、or r16,m16

16位的寄存器与16位的内存相或

例子:or ax,word ptr ds:[0x13ffc8]

9、or r32,m32

32位的寄存器与32位的内存相或

例子:or eax,dword ptr ds:[ox13ffc8]

 

xor指令

xor是异或指令,即不同时结果才为1.xor指令可以这么理解:xor A,B -> A = A xor B,所以A不能为立即数,当然AB不能同时为内存。

xor指令可以有的情况:

1、xor r8/m8,imm8

8位寄存器或8位内存与8位的立即数相异或

例子1:xor al,0x11

例子2:xor byte ptr ds:[0x13ffc8],0x11

2、xor r16/m16,imm16

16位寄存器或16位内存与16位的立即数相异或

例子1:xor ax,0x1111

例子2:xor word ptr ds:[0x13ffc8],0x1111

3、xor r32/m32,imm32

32位寄存器或32位内存与32位的立即数相异或

例子1:xor eax,0x11111111

例子2:xor dword ptr ds:[0x13ffc8],0x11111111

4、xor r8/m8,r8

8位的寄存器或8位的内存与8位的寄存器相异或

例子1:xor al,ah

例子2:xor byte ptr ds:[0x13ffc8],ah

5、xor r16/m16,r16

16位的寄存器或16位的内存与16位的寄存器相异或

例子1:xor ax,cx

例子2:xor word ptr ds:[0x13ffc8],cx

6、xor r32/m32,r32

32位的寄存器或32位的内存与32位的寄存器相异或

例子1:xor eax,ecx

例子2:xor dword ptr ds:[0x13ffc8],ecx

7、xor r8,m8

8位的寄存器与8位的内存相异或

例子:xor ah,byte ptr ds:[0x13ffc8]

8、xor r16,m16

16位的寄存器与16位的内存相异或

例子:xor ax,word ptr ds:[0x13ffc8]

9、xor r32,m32

32位的寄存器与32位的内存相异或

例子:xor eax,dword ptr ds:[ox13ffc8]

not指令

not是取反指令,即1变成00变成1not指令可以这么理解:not A -> A = not A,所以A不能是立即数。

not指令可以有的情况:

1、not r8/m8

8位的寄存器或8位的内存取反

例子1:not al

例子2:not byte ptr ds:[0x13ffc8]

2、not r16/m16

16位的寄存器或16位的内存取反

例子1:not ax

例子2:not word ptr ds:[0x13ffc8]

3、not r32/m32

32位的寄存器或32位的内存取反

例子1:not eax

例子2:not dword ptr ds:[0x13ffc8]

 

这些指令大家最好自己在OD上练习一遍吧,虽然有点多,但是多练习,可以帮助理解数据宽度。

 

写于2020.5.7 0:23

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值