xmm0 汇编movss
(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 三、标志寄存器
- 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
-
PF标志(flag的第2位) 奇偶标志位。(parity flag) 指令执行后,结果中所有二进制位中1的个数 为偶数,PF=1 为奇数,PF=0
-
SF标志(flag的第7位) 符号标志位。(sign flag) 在我们将数据当作有符号数来运算时,可以得知结果的正负 在我们将数据当作无符号数来运算时,该位无意义 指令执行后, 结果为负,SF=1 结果为正,SF=0
-
CF标志(flag的第0位) 进位标志位。(无符号数) 最高位产生进位或借位,CF=1
-
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,则串处理过程中,自动递减,否则自动递增。
- abc标志
- sbb标志
- 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分析
- 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
29.STOSB(STOSW,STOSD) 字符串存储指令 stosb stos byte ptr [edi] stosw stos word ptr [edi] stosd stos dword ptr [edi] 相当于 mov byte ptr [edi],al mov word ptr [edi],ax mov dword ptr [edi],eax
使用案例: rep stosb rep stos byte ptr [edi] 功能:用al的值填充 ptr [edi]的值,每次ecx减一,edi+1(al的大小)
30 IMUL(有符号数乘法) 指令执行有符号整数乘法。 与 MUL 指令不同,IMUL 会保留乘 积的符号,实现的方法是,将乘积低半部分的最高位符号扩展到高半部分。
31.LODSB(LODSW,LODSD) 字符串载入指令。 rep lodsb lods byte ptr [esi] 功能:将byte ptr [esi]的值放入al中,ecx-1(记数),esi+(byte的大小),直到ecx=0
32.LOOP 循环控制指令 loop 标号 功能: (1)ecx=ecx-1 (2)ecx!=0,则转移至标号 (3)直至ecx=0;
33.SETE(SETZ),SETNZ(SETNE),SETG,SETL,SETGE 条件置位指令。 SETE(SETZ) al 取ZF的值保存到al中(==比较时) SETNZ(SETNE) al 将zf的值取反保存到al中(!=比较时)
SETG al (>比较时) 受zf,sf,of影响 ZF=0&&SF=0&&OF=1时al=1
SETL al (<比较时) 受zf,sf,of影响SF=1||OF=1时al=1
SETGE al (>=比较时)
SETLE al (<=比较时)
- CDQ—Convert Double to Quad (386+) 该指令把edx扩展为eax的高位,也就是说变为64位。
五、32位通用寄存器
- 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) 功能:添加在函数头,表示该函数用汇编编写,不需要编译器添加任何代码