概述
前言
上一节说了,内存的读写。这样就可以讲几条汇编指令了。mov、add、sub、and、or、xor、not共7条汇编指令,会把每条指令的使用范围说清楚,可能比较枯燥。
先说明几个标记符号吧。只是为了后面方便写。
r:通用寄存器(register)
m:内存(memory)
imm:立即数(immediate)
r、m、imm这三个后面加数字,那么这个数字表示多少位。例如: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不能是立即数。A、B两个操作数不能同时为内存。
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不能是立即数。当然A、B不能同时为内存。
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,或的结果是1。or指令可以这么理解:or A,B -> A = A or B,所以A不能是立即数。当然A、B不能同时为内存。
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不能为立即数,当然A、B不能同时为内存。
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变成0,0变成1。not指令可以这么理解: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
最后
以上就是阳光百合为你收集整理的第十五课_几条汇编指令的全部内容,希望文章能够帮你解决第十五课_几条汇编指令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复