一、ADC指令
-
带进位加法,即在两个数正常相加后,还要加上CF标志位的值:如果CF位为0,则不用管;如果CF位为1,则结果还要加上1
-
格式:
ADC R/M,R/M/IMM #两边不能同时为内存,且宽度要一样 #举例: ADC AL,CL ADC BYTE PTR DS:[12FFC4],2 ADC BYTE PTR DS:[12FFC4],AL
二、SBB指令
-
带借位减法,即在两个数正常相减后,还要减去CF标志位的值
-
格式:
SBB R/M,R/M/IMM #两边不能同时为内存,宽度要一样 #举例: SBB AL,CL SBB BYTE PTR DS:[12FFC4],2 SBB BYTE PTR DS:[12FFC4],AL #宽度一致
三、XCHG指令
-
交换数据
-
格式:
XCHG R/M,R/M #后面不能是立即数!两边不能同时为内存,宽度要一样 #举例: XCHG AL,CL XCHG DWORD PTR DS:[12FFC4],EAX XCHG BYTE PTR DS:[12FFC4],AL #宽度一致
四、MOVS指令
-
内存和内存之间移动数据(这是比较少有的源操作数与目标操作数都可以为内存的命令)
-
将后面ESI中存的内存地址编号中的值(按照给定的数据宽度来取),存入到前面的EDI中存的内存地址编号中
-
如果DF标志位为0,则继续
- 根据指定的内存宽度byte/word/dword来决定ESI和EDI的内存地址编号+1/+2/+4
-
如果DF标志位为1,则继续
- 根据指定的内存宽度byte/word/dword来决定ESI和EDI的内存地址编号-1/-2/-4
-
-
格式:
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为 MOVSB MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] 简写为 MOVSW MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 简写为 MOVSD
-
举例说明movs指令作用
mov esi,0x19ff74 #esi寄存器中存的值为内存地址0x19ff74,且已知此内存地址中存的值为0x11111111 mov edi,0x19ff80 #edi寄存器中存的值为内存地址0x19ff80,且已知此内存地址中存的值为0x22222222 #当DF标志位为0时 movsb #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22222211,且esi和edi中的值都加1,则esi中值为 0x19ff75,edi中的值为0x19ff81 #当DF标志位为1时 movsb #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22222211,且esi和edi中的值都减1,则esi中值为 0x19ff73,edi中的值为0x19ff7f
mov esi,0x19ff74 mov edi,0x19ff80 #当DF标志位为0时 movsw #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22221111,且esi和edi中的值都加2,则esi中值为 0x19ff76,edi中的值为0x19ff82 #当DF标志位为1时 movsw #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22221111,且esi和edi中的值都减2,则esi中值为 0x19ff72,edi中的值为0x19ff7e
mov esi,0x19ff74 mov edi,0x19ff80 #当DF标志位为0时 movsd #执行后,edi中的存的内存地址0x19ff80中的值变化为0x11111111,且esi和edi中的值都加4,则esi中值为 0x19ff78,edi中的值为0x19ff84 #当DF标志位为1时 movsd #执行后,edi中的存的内存地址0x19ff80中的值变化为0x11111111,且esi和edi中的值都减4,则esi中值为 0x19ff70,edi中的值为0x19ff7c
-
以后开发中要注意:如果遇到MOVS指令,很可能是字符串的复制
五、STOS指令
-
将AL/AX/EAX的值存储到**[EDI]指定的内存单元**,至于是AL、AX、EAX,取决于给的数据宽度是byte、word、dword,接着将EDI中存的值依据DF标志位为0还是1以及数据宽度,加1/2/4或者减1/2/4
-
格式:
STOS BYTE PTR ES:[EDI] 简写为 STOSB STOS WORD PTR ES:[EDI] 简写为 STOSW STOS DWORD PTR ES:[EDI] 简写为 STOSD
-
举例说明STOS指令执行结果:
MOV EAX,0x12345678 MOV EDI,0x19FF74 #将内存地址编号0x19ff74存入edi中,且已知此内存地址中的值为0x75b5fa29 #当DF标志位为0时 STOS BYTE PTR ES:[EDI] #edi指定的0x19ff74内存单元中的值变为0x75b5fa78,并且edi中的值加1,变为 0x19ff75 ---------------------------- #当DF标志位为1时 STOS BYTE PTR ES:[EDI] #edi指定的0x19ff74内存单元中的值变为0x75b5fa78,并且edi中的值减1,变为 0x19ff73
MOV EAX,0x12345678 MOV EDI,0x19FF74 #将内存地址编号0x19ff74存入edi中,且已知此内存地址中的值为0x75b5fa29 #当DF标志位为0时 STOS WORD PTR ES:[EDI] #edi指定的0x19ff74内存单元中的值变为0x75b55678,并且edi中的值加2,变为 0x19ff76 ---------------------------- #当DF标志位为1时 STOS WORD PTR ES:[EDI] #edi指定的0x19ff74内存单元中的值变为0x75b55678,并且edi中的值减2,变为 0x19ff72
MOV EAX,0x12345678 MOV EDI,0x19FF74 #将内存地址编号0x19ff74存入edi中,且已知此内存地址中的值为0x75b5fa29 #当DF标志位为0时 STOS DWORD PTR ES:[EDI] #edi指定的0x19ff74内存单元中的值变为0x12345678,并且edi中的值加4,变为 0x19ff78 ---------------------------- #当DF标志位为1时 STOS DWORD PTR ES:[EDI] #edi指定的0x19ff74内存单元中的值变为0x12345678,并且edi中的值减4,变为 0x19ff70
六、REP指令
-
按计数寄存器 (ECX) 中指定的次数重复执行字符串指令(STOS、MOVS),每执行一次,ECX的值会减1,最终减为0结束执行
-
格式:
MOV ECX,0x10 #重复的次数为16次 MOV EAX,0x12345678 #存入EDI中的值为0x12345678,根据数据宽度来取 #如果DF标志位为0 REP STOS DWORD PTR ES:[EDI] #将EAX中的值0x12345678取DWORD--32位存入EDI中存的内存地址中,并且EDI 中存的值会自动+4。接着将上述过程循环16次 ----------------------------------------------------------------------- #如果DF标志位为1 REP STOS DWORD PTR ES:[EDI] #将EAX中的值0x12345678取DWORD--32位存入EDI中存的内存地址中,并且EDI 中存的值会自动-4。接着将上述过程循环16次
MOV ECX,0x10 #重复的次数为16次 #如果DF标志位为0 REP MOVSD #将ESI中存的内存地址中的值取DWORD--32位存入EDI中存的内存地址中,并且EDI和ESI中存的内存地 址值自动+4。接着将上述过程循环16次 ----------------------------------------------------------------------- #如果DF标志位为1 REP MOVSD #将ESI中存的内存地址中的值取DWORD--32位存入EDI中存的内存地址中,并且EDI和ESI中存的内存地 址值自动-4。接着将上述过程循环16次
七、作业
1.熟练记住CF/PF/AF/ZF/SF/OF的位置
- CF为进位标志,0位;PF为奇偶标志,2位;AF为辅助进位标志,4位;ZF为零标志,6位;SF为符号标志,7位;OF为溢出标志,11位;DF为方向标志,10位
2.写汇编指令影响标志位
-
只影响CF位的值(不能影响其他标志位)
mov eax,0xff add eax,0x4
-
只影响PF位的值(不能影响其他标志位)
mov eax,0x1 add eax,0x2
-
只影响AF位的值(不能影响其他标志位)
mov eax,0x20 sub eax,0x01
-
只影响SF位的值(不能影响其他标志位)
mov eax,0x01111111 or eax,0xf0000000
-
只影响OF位的值(不能影响其他标志位)?????不会
mov eax,0x7f11 add ax,0x1123
3.MOVS、STOS指令练习
-
MOVS指令分别移动5个字节、5个字、5个双字
movsb movsw movsd movsb movsw movsd movsb movsw movsd movsb movsw movsd movsb movsw movsd
-
STOS指令分别存储5个字节、5个字、5个双字
mov eax,0x11111111 stosb stosw stosd stosb stosw stosd stosb stosw stosd stosb stosw stosd stosb stosw stosd
4.使用REP指令重写3练习
-
rep movs
mov ecx,0x5 rep movsb
-
rep stos
mov eax,0x11111111 mov ecx,0x5 rep stosd