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
三、标志寄存器

  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

  1. PF标志(flag的第2位)
    奇偶标志位。(parity flag)
    指令执行后,结果中所有二进制位中1的个数
    为偶数,PF=1
    为奇数,PF=0

  2. SF标志(flag的第7位)
    符号标志位。(sign flag)
    在我们将数据当作有符号数来运算时,可以得知结果的正负
    在我们将数据当作无符号数来运算时,该位无意义
    指令执行后,
    结果为负,SF=1
    结果为正,SF=0

  3. CF标志(flag的第0位)
    进位标志位。(无符号数)
    最高位产生进位或借位,CF=1

  4. 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,则串处理过程中,自动递减,否则自动递增。

  1. abc标志
  2. sbb标志
  3. 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分析

  1. 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 (<=比较时)

  1. CDQ—Convert Double to Quad (386+)
    该指令把edx扩展为eax的高位,也就是说变为64位。

五、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)
功能:添加在函数头,表示该函数用汇编编写,不需要编译器添加任何代码

最后修改:2022 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏