(8086CPU)
一、汇编语言中的大小写转换
A: 65 100 0001B
a: 97 110 0001B
B: 66 100 0010B
b:98 110 0010B
大写字母与小写字母间的ASCII码相差32,即可以使用与或的方式进行转换
变小写 0100 0001B || 0010 0000 B
变大写 0110 0001B && 1101 1111 B
二、常用寄存器
1.ax
AX寄存器称为累加器(Accumulator),使用时主要用于存放数据,如存放算术、逻辑运算中的操作数或结果。也可临时时用于存放地址。可以拆分为ah,al
2.bx
BX寄存器称为基址寄存器(BaseRegister),常用来存放访问存储器时的地址。可以拆分为bh,bl
3.cx
4.dx
5.si,di
6.bp,sp,ip
7.cs,ss,ds,es
三、标志寄存器
1. ZF标志(flag的第6位)
零标志位。(Zero Flag)
执行相关指令后,如果
结果为0,ZF=1
结果不为0,ZF=0
sub ax,ax
执行后,结果为0,则ZF=1
and ax,0
执行后,结果为0,则ZF=1
mov ax,1
or ax,0
执行后,结果为1,则ZF=0
2. PF标志(flag的第2位)
奇偶标志位。(parity flag)
指令执行后,结果中所有二进制位中1的个数
为偶数,PF=1
为奇数,PF=0
3. SF标志(flag的第7位)
符号标志位。(sign flag)
在我们将数据当作有符号数来运算时,可以得知结果的正负
在我们将数据当作无符号数来运算时,该位无意义
指令执行后,
结果为负,SF=1
结果为正,SF=0
4. CF标志(flag的第0位)
进位标志位。(无符号数)
最高位产生进位或借位,CF=1
5. OF标志
溢出标志位。(有符号数)
若结果超出表示范围,则成为溢出,OF=1,否则为0
6.AF标志
辅助进位标志
一个加法(减法)运算结果的低4位向高4位有进位(或借位)时,则AF=1,否则AF=0
7.TF 标志
跟踪标志。
该标志位为方便程序调试而设置的。若TF=1,CPU处于单步工作方式,
即在每条指令执行结束后,产生中断
8.IF标志
中断标志。
该标志位用来控制cpu是否响应可屏蔽中断。若IF=1则运行中断,否则禁止中断
9.DF方向标志
该标志位用来控制串处理指令的处理方向。若DF=1,则串处理过程中,自动递减,否则自动递增。
6. abc标志
7. sbb标志
8. cmp标志
四、汇编指令
1.cmp 指令
比较指令,相当于减法,不保存结果。对标志寄存器影响。
格式: CMP A,B
功能:两个操作数相减,A-B ,结果影响标志位。
主要用于条件转移指令,如:JZ/JE 当ZF=1时,跳转
2.MOVSX
符号扩展传送。
(操作数B所占空间必须小于操作数A)
MOVSX A,B
3.MOVZX
零扩展传送.
(操作数B所占空间必须小于操作数A)
MOV A,B
4.LEA
有效的地址传送指令
格式:LEA A,B
将操作数B的有效地址传送到某个指定的寄存器,操作数A必须是寄存器
(32位系统上就是32位寄存器)
5.SUB
减法指令
格式:sub A,B A=A-B
功能:两个操作数相减,结果放在A中
影响 ZF标志位
6.JE/JZ
等于条件转移指令。
格式:JE/JZ 标号 //等于跳转
功能:ZF=1,跳转到指定地址执行。
根据标志ZF进行跳转
7.JNZ/JNZ
不等于转移指令。
格式:JNE/JNZ 标号
功能:ZF =0;转移至标号地址处
8.JMP/GOTO
无条件跳转指令。
格式:JMP A
不对标志位影响。
9.JL/JNGE
有符号小于/不大于等于转移指令
格式:JL/JNGE 标号地址
功能:小于/不大于等于 时转移到标号地址
JL 有符号 小于 则跳转 Jump if less
JNGE 有符号 不大于等于 则跳转 Jump if not greater or equal
SF =1; 跳转到标号地址执行
10.JLE/JNG
有符号小于等于/不大于转移指令
格式:JLE/JNG 标号
功能:小于等于或不大于时转到标号地址
JNG 有符号 不大于 则跳转 (JUMP if not greater)
JLE 有符号 小于等于 则跳转 (Jump if less or equal)
ZF =1 || SF != OF
11.JG/JNLE
有符号大于/不小于等于转移指令
格式: JG/JNLE 标号地址
功能:大于/不大于等于 时转到目标地址
JG 有符号 大于 则跳转 jumpo if greater
JNLE 有符号 不小于等于 则跳转 jump if not less or equal
ZF=0 && SF=OF (SF =1 && OF =1 两个数相减 结果为负 有溢出)(SF&&OF=0,两个数相减 结果位正 ,么有溢出)
12.JA/JNBE
无符号大于转移指令。
Above 高于
Below 低于
JA : 高于时 跳转 >
JNBE 不低于等于 跳转 !<=
CF=0 && ZF=0 则跳转
13.JNB/JAE/JNC
无符号大于等于
JNB : 不低于 跳转
JAE:高于等于 跳转
JNC:没有进位时 跳转 jump not carry //CF
14.JB/JNAE/JC
无符号小于转移指令
JB: 低于 跳转
JNAE:不高于等于时 跳转
JC: 进位时 跳转
15.JBE/JNA
无符号大于转移指令
JBE: 低于等于时 跳转
JNA: 不高于时 跳转
16.PUSH、POP、CALL、RETN
1.push入栈指令(压栈指令)
格式:PUSH 操作数
push ebp相当于:
sub esp,4 ,栈顶上升(内存中减少)
mov [esp],ebp
2.POP出栈指令(弹栈)
格式:POP 操作数
pop ebp 相当于:
mov ebp,[esp]
add esp,4 ;栈顶下降(内存中增加)
操作数不能为立即数
3.CALL
CALL 执行时,会push EIP
RETN 执行时,会pop EIP
17.inc,dec
自增,自减
不影响CF
18.movss
浮点指令
格式 movss xmm0, dword ptr ds:[]
功能:将一个浮点数放入 xmm0寄存器
格式 movss dword ptr ds:[], xmm0,
功能:将 xmm0寄存器中的数字放入内存
19.addss
浮点数加法
格式:addss xmm0,内存地址
20.subss
浮点数减法
格式:subss xmm0,内存地址
21.mulss
浮点数乘法
格式:mulss xmm0,内存地址
22.divss
浮点数除法
格式:divss xmm0,内存地址
23.cvtsi2sd
整数转换为浮点数
将内存地址转换为浮点数放入xmm0,
格式:cvtsi2sd xmm0,dword ptr ss:[ebp-4]
24.cvttss2si
浮点数转换为整数
格式:cvttss2si eax,dword ptr ss:[ebp-4]
25.SHR,SHL,SAR,SAL,ROR,ROL
1.逻辑位移指令
(1)SHR逻辑右移指令(Shift Right)
右移一位相当于整除2,用0补位
格式:shr eax,8
(2)SHL逻辑左移指令
左移一位,相当于乘2,用0补位。有可能溢出
格式:shl eax,2
2.算术位移指令
(1)SAR算术右移指令
右移一位相当于整除2,用符号位补位
格式:sar eax,8
(2)SAL算术左移指令,与SHL完全相同
左移一位,相当于乘2,用0位补位。有可能溢出
格式:sal eax,2
3.循环位移指令ROR,ROL
26.逻辑运算符
1.或运算
1)逻辑或(||)
if(a||b)
{
}
截断原理
2)按位或(|)or
2.与运算
1)逻辑与 (&&)
2)按位与(&)and
Test
命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
3.非运算
1)逻辑取反(!)
SETE(SETZ)没见到过。取zf标志位的值保存
SETNE(SETNZ)取zf标志位的值取反后保存
2)按位取反(~)not
4.异或运算 xor
1)按位异或(C语言中^)
1 ^ 1=0;0 ^ 0=0;
1 ^ 0 =1, 0 ^ 1=1;
27.字符操作相关指令
1.strcmp分析
2. REPNE(REPNZ) SCASB 指令
1)SCASB 指令(scan string byte)
编译后 SCAS BYTE PTR ES:[EID]
相当于cmp byte ptr [edi] ,al
对标志位的影响相当于sub,同时修改edi
如果DF =0;inc edi
如果DF =1;dec edi
相似的还有 SCASW(word–ax) ,SCASD(dword–eax)
2)Repne(REPNZ) 指令 repeat not Zero
REPNE SCAS BYTE PTR ES:[EID]
当ecx!=0且zf=0时,重复执行后边的指令
每执行一次ecx-1
(ecx限制比较次数,用于数组。eax 存放查找的内容)
3.REPE(REPZ)和CMPSB、CMPSW、CMPSD
1)CMPS
字符串比较
cmps byte ptr [edi],byte ptr [esi]
cmps word ptr [edi],word ptr [esi]
cmps dword ptr [edi],dword ptr [esi]
对标志位的影响,相当于sub,同时修改edi和esi
如果df=0,则edi、esi按相对大小递增
如果df=1,则edi、esi按相对大小递减
2)REPE/REPZ
repe/repz cmpsb 当ecx!=0并且zf=1时,重复后面指令
每执行一次ecx -1
3)实例运用
字符串是否相等
28.STD/CLD(修改方向标志位)
STD 修改DF=1
CLD 修改DF=0
五、32位通用寄存器
1. EAX 可拆分 AX AH AL
2.EBX 可拆分 BX BH BL
3.ECX 可拆分 CX CH CL
4.EDX 可拆分 DX DH DL
六、栈寄存器
1.EBP 寄存器 栈底指针
EBP是一个特殊的寄存器,通过EBP+偏移量 ,可以发访问CALL的局部变量
低16位叫BP
2.ESP 寄存器 栈顶指针
ESP栈顶指针与EBP栈底指针构成一段空间。一般是本CALL局部变量的空间大小总和。
ESP指针配合EBP使用。
七、C
1.__declspec(naked)
功能:添加在函数头,表示该函数用汇编编写,不需要编译器添加任何代码