汇编指令记录

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

posted @ 2021-09-26 23:47  乘舟凉  阅读(269)  评论(0编辑  收藏  举报