最近在师傅的领导下着手学习逆向课程,接触了许多汇编语句,开个帖记录一下。
pushad:将8个寄存器的值存入内存
popad:将原寄存器中的值从内存中取出后复原
adc:带进位加法(加上C寄存器) sbb:带进位减法(加上C寄存器) xchg:交换寄存器的值 movs:移动数据 内存-内存 byte:movsb - movs byte ptr ds:[edi],byte ptr ds:[esi] word:movsw - movs word ptr ds:[edi],word ptr ds:[esi] dword:movsw - movs dword ptr ds:[edi],dword ptr ds:[esi] STOS:将Al/AX/EAX的值存储到[EDI]指定的内存单元 stosb:stos byte ptr es:[edi] stosw:stos word ptr es:[edi] stosd:stos dword ptr es:[edi] rep:按计数寄存器(ECX)中指定的次数重复执行字符串指令 jmp:修改eip的值,其他寄存器都不变 call:修改eip,栈顶esp-4 retn:相当于pop eip指令,出栈,回到esp+4处,栈顶+4 cmp:比较两个数,若相等,z寄存器为1 若第一个数小于第二个数,s寄存器为1,否则为0 test:确定寄存器是否为0,相当于与运算,观察z位是否为0 xor eax,eax:将eax寄存器的值清零
rep stos 实例:
mov ecx,0x13 //0x13存入ecx
mov eax,0xCCCCCCCC //0xCCCCCCCC存入eax
rep stos dword ptr es:[edi] //重复执行ecx的值为次数(rep),将eax的值存入edi(stos)
此实例主要用于填充缓冲区,作用一是清除缓冲区之前的垃圾数据,作用二是为了防止缓冲区溢出(eax存入的0xCCCCCCCC为int3)
imul指令:有符号乘,影响 OF、CF 标志位
如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX
如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX
如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX