一、汇编
- 在计算机中,正数原码存,负数补码存
- 与运算,串联。或运算,并联。异或运算,不一样的为1比如
左移,二进制向左移位,高位丢弃,低位补零。右移,(shr,向右移,低位丢弃,高位补零。sar,向右移,低位丢弃,高位补符号位) - 加法流程: 异或,判断进位(如果不为零),继续左移然后异或,判断是否有进位。
- (32位)通用寄存器:EAX, ECX ,EDX,EBX,ESP,EBP,ESI,EDI.16位AX,CX,BX,DX,BP,SP,SI,DI.8位AL,AH,BL,BH,CH,CL,DH,DL
- 内存的5种地址形式:[立即数],[reg(8个32位通用寄存器之一)],[reg+立即数],[reg+reg*{1,2,4,8}],[reg+reg*{1,2,4,8}+立即数]
- 存储模式,大端模式:数据高位在低位,低位在高位,小端模式:数据低位在低位,高位在高位 ,x86一般采用小端存储,ARM一般 采用大端模式
- 汇编指令
//r 通用寄存器
//m 内存
// imm 立即数
// r8 8位通用寄存器
//m8 8位内存
// imm 8位立即数
MOV {r8,r16,r32,m8,m16,m32},{r8,r16,r32,m8,m16,m32,imm8,imm16,imm32}
mov不能同时为m
ADD {r8,r16,r32,m8,m16,m32},{r8,r16,r32,m8,m16,m32,imm8,imm16,imm32}
SUB {r8,r16,r32,m8,m16,m32},{r8,r16,r32,m8,m16,m32,imm8,imm16,imm32}
AND {r8,r16,r32,m8,m16,m32},{r8,r16,r32,m8,m16,m32,imm8,imm16,imm32}
OR {r8,r16,r32,m8,m16,m32},{r8,r16,r32,m8,m16,m32,imm8,imm16,imm32}
XOR {r8,r16,r32,m8,m16,m32},{r8,r16,r32,m8,m16,m32,imm8,imm16,imm32}
NOT {r8,r16,r32,m8,m16,m32}
MOVS 内存到内存
MOVSB MOVSW MOVSD
MOVSB PTR ES:[EDI],PTR DS[ESI]
MOVSD PTR ES:[EDI],PTR DS[ESI]
MOVSW PTR ES:[EDI],PTR DS[ESI]
STOS 将al、ax、eax的值放到[EDI]指定位置
STOSB STOSD STOSW
STOS PTR ES:[EDI]
REP:桉计数寄存器(ECX)中指定的次数重复执行字符串指令
PUSH ESP-{4,2}
PUSH{R16,R32,Imm16,Imm32,imm8,m16,m32}
POP ESP+{4,2}
POP{R16,R32,M32,M16}
JMP call 修改EIP
JMP m/imm/reg 32位 reg->EIP
CALL m/imm/reg 32位 下一条指令压栈 reg->EIP
ret :ESP地址+4,[ESP] ->EIP
对内存进行读取时一定要注意声明数据宽度
8.堆栈平衡:如果返回父程序,则当我们在堆栈中进行堆栈操作时,保证在这条指令之前,esp指向的是我们压入栈中的地址;如果通过堆栈传递参数了,在函数执行完毕后,要平衡参数导致的堆栈变化。