汇编指令记录
SHL(汇编指令)。 shift letf 格式:SHL DST,1
功能:将目的操作数顺序左移1位或CL寄存器中指定的位数。左移一位时,操作数的最高位移入进位标志位CF,最低位补零。
ROL(循环左移)
指令把所有位都向左移。最高位复制到进位标志位和最低位。
scasb(scanf string byte)
将 AL 与 ES:(E)DI 的字节进行比较,然后设置状态标志。比较后,(E)DI 寄存器根据 EFLAGS 寄存器中 DF 标志的设置自动递增或递减。如果 DF 标志为 0,则 (E)DI 寄存器递增;如果 DF 标志为 1,则 (E)DI 寄存器递减
repne scasb
一般会与repne一起使用,repne会将ecx递减,同时检查ZF是否为0,为0则重复执行指令,否则执行下一条指令
xor eax,eax
lea edi,dword ptr ss:[ebp-120]//将字符串首地址赋予edi
or ecx,FFFFFFFF//因为ecx==0是repne会失效,所将ecx初始化为-1
repne scasb//和将di与al进行比较,也就是看dl是否为0,不为0,则EDI++,ECX--,继续比较,否则停止循环 这里实际进行了len+1次比较,因为和末尾的0比较ecx也会-1
not ecx //取反ecx,负数取反等于相反数-1,所以ecx = -[-1-(len+1)]-1 = len+1
//所以上面的汇编代码就是计算字符串的长度的
movsd(move string dword)
将esi的四个字节的内存复制到edi,并且esi与edi都加4
rep movsd
一般会与rep一起使用,将esi的四个字节的内存复制到edi,并且esi与edi都加4,ecx--,重复执行指令,直到ecx为0
movaps xmm0,xmmword ptr ds:[1400143C0]
movaps是浮点数的复制,上面的意思是将1400143c0处的16字节大小的数据复制到xmm0中
fcomp qword ptr ds:[0x408260]
比较 ST(0) 与qword ptr ds:[0x408260]并弹出浮点寄存器堆栈。
比较寄存器 ST(0) 的内容和源值,并根据结果在 FPU 状态寄存器中设置条件代码标志 C0、C2 和 C3(见下表)
Condition | C3 | C2 | C0 |
---|---|---|---|
ST(0) > SRC | 0 | 0 | 0 |
ST(0) < SRC | 0 | 0 | 1 |
ST(0) = SRC | 1 | 0 | 0 |
Unordered* | 1 | 1 | 1 |
FPU 状态寄存器为两个字节,各个位的含义见下表
Status Bit 状态位 | Description 描述 |
---|---|
0 | Invalid operation exception flag 无效操作异常标志 |
1 | Denormalized operand exception flag 非常规操作数异常标志 |
2 | Zero divide exception flag 除零异常标志 |
3 | Overflow exception flag 溢出异常(值太大时溢出)标志 |
4 | Underflow exception flag 溢出异常(值太小时溢出)标志 |
5 | Precision exception flag 精度异常标志 |
6 | Stack fault 栈错误 |
7 | Error summary status 错误摘要状态 |
8 | Condition code bit 0 (C0) 条件代码位0 |
9 | Condition code bit 1 (C1) 条件代码位1 |
10 | Condition code bit 2 (C2) 条件代码位2 |
11-13 | Top of stack pointer 栈顶指针 |
14 | Condition code bit 3 (C3) 条件代码位3 |
15 | FPU busy flag FPU正在计算中的忙标志 |
假设 ST(0) 为 0 , qword ptr ds:[0x408260] 为0,fcomp 执行后,c3为1,浮点状态寄存器的第15位(14)被设为1,值为0100 0000 0000 0000 == 0x4000
fnstsw ax
将FPU状态寄存器的值复制到ax中
fild [esp+14h+fSize](FPU int load)
将int型数据fSize加载到FPU寄存器ST(0)上
fstp [esp+1Ch+dSize] (FPU store pop)
将FPU寄存器ST(0)的值存储到dSize中,并将ST(0)的数据出栈
CMPSB (compare string byte)
该指令可用于将一个字符串中的字节(字)(DS:SI 中的偏移量)与另一个字符串中的字节(字)(ES:DI 中的偏移量)进行比较。通过从 SI 中的字节(字)中减去 DI 中的字节(字)来执行比较。
shrd eax,edx,cl
将edx向右移cl位,eax也向右移cl位,edx移出来的数据保存在eax的高位,edx不变,eax移出来的数据丢弃
eg. eax == 0x00000000 edx == 0x7FF7E001 cl == 0x14
shrd eax,edx,cl 后
eax == 7E001000 edx == 0x7FF7E00
本文作者:乘舟凉
本文链接:https://www.cnblogs.com/czlnb/p/15341061.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步