汇编的基础不能一蹴而就,一步一步在实践中学习得来的,只有这样知识才能稳定的进到脑子里,在用的时候不会出现短路的情况。(emmmmmmmm,断路更合适一点_ (:з」∠) _)

这里就没有顺序的讲述了,有什么就记什么了,添加个索引到时候自己就可以分类了

函数约定

cdecl

流程:

  1. push参数
  2. call memory_location 调用函数,push EIP,保存当前指令地址,然后修改EIP为指定函数地址
  3. push EBP,保存当前栈底
  4. 函数工作(ps:开始头部一般都是,esp=ebp,esp-=xxx)
  5. pop EBP
  6. pop EIP并跳转(ps:这里相当于ret)
  7. 调整之前栈里面保持的参数

流程图如下:
cdecl流程图

其余约定等待更新,预计三天后

常用指令说明(很常见的不提,这里只提一些关键但不是很普遍的,或者不容易懂得)

cmp指令 && test指令 && 跳转指令

cmp:通过比较两个寄存器设置标志位
| cmp dst,src | ZF | CF |
|:————–:| :: | :: |
|dst=src(重要) | 1 | 0 |
|dstsrc | 0 | 0 |
所以if(!cmp)是判断字符串是否相同

test:相当于and(一般看ZF)

jz,jnz:ZF=1跳;ZF=0跳 ======= je,jne
jg,jge:dst>src\目标操作数大于源操作数\CF==0跳;jge为大于等于
jl,jle:dst>src\目标操作数小于源操作数\CF==0跳;jge为小于等于

mul && div

乘除不说,说一下结果保存点,EAX与EDX
mul:EAX保存低32位、EDX保存高32位
div:EAX保存商、EDX保存余数

格式:

mul value;div value;

缓冲区操作指令 && 重复指令

movsx、cmpsx、stosx、scasx(x代表字节大小,可分为b,w,d,q)(这些操作只在EDI、ESI里面执行)

movsx:从[ESI]取出字节,交到[EDI],然后根据DF标志加1或减1(DF=0,+)\(DF=1,-1)
cmpsx:比对[ESI],[EDI]中的字节
stosx:将指定字节存入[EDI]
scasb:从一串字节中搜索一个值,该值由AL给出,存到[EDI]
rep重复指令停止条件
rep:ECX为0时循环终止
repe、repz:ECX为0 or ZF=0 时循环终止(字符串是否相同)
repne、repnz:ECX为0 or ZF=1 时循环终止

组合:

rep movsx :[EDI]=[ESI] 直到ECX=0;———-memcpy
repe cmpsx :判断?[EDI+i]==[ESI+i] 直到ECX=0 or ≠;———-memcmp
repne scasx :从缓冲区中搜索一个字节 直到ECX=0 or = \有便存入
rep stosx:给定初始值赋给一段缓冲区,[EDI]指向缓冲区地址,AL包含初始值;———-memset


一个好奇的人