逻辑运算
计算的本质:
计算2+3:
计算两个值的异或和与,如果与运算左移一位后为零,则异或值为最终结果,否则进入第二步
上一步的异或和与值作为新的两个值,同样计算异或和与值,重复以上步骤直至与值为0,则异或值为最终结果
eg:2-3
- 即0010+1101 xor:1111 & :0000 与值为零 最终结果为1111 即-1
通用寄存器:
源操作数和目标操作数不能同时为内存,目标操作数不能为立即数
寄存器和内存:
反汇编和寄存器界面将内存数据高位在前储存,而实际上内存在计算机中的编号如地址界面
内存寻址
堆栈结构
PUSH POP LEA
可以看作是 赋值+抬升/降低栈顶指针ESP的结合
对32位寄存器/立即数的push/pop 会使指针改变4位
对16位寄存器 2位
不允许push/pop 8位寄存器
push/pop r/m 16/32
LEA 取地址
标志寄存器
mov指令不改变标志寄存器的值
af cf区别:cf只关注最高位的进位 af关注 字节/4位 的进位
cf of区别: cf无符号计算 of有符号计算
ADC及相关指令
movs【x】执行后,ESI和EDI分别(+/-):与dflag有关 df1为-,df0为+【x】地址
x: d-4 w-2 b-1
关于 内存有关写法: PTR DS:[xxx] PTR ES:[EDI] 只有内存为EDI时写ES其余写DS 与段页有关
JMP相关&&JCC
call=jmp+push(call下一个地址即返回地址)(压栈) 表现为EIP和ESP变化 类似调用函数?
return =jmp+pop(EIP)对应于call
Less&Greater为有符号数 Below&Above为无符号数
绘制堆栈图
ctrl+G跳转 相应位置
将两个参数压入栈中
调用函数并将返回地址压入栈中,保存当前栈底
提升栈底,提升栈顶创建缓冲区,保存现场将EDI,ESI,EBX压入栈
取出目标地址给EDI,赋值ECX为10,重复储存10次EAX值到EDI处,赋值/加参数给EAX
三个寄存器值出栈,还原现场,压下栈顶到栈底处,栈底出栈还原
POP EIP函数调用结束返回
ADD ESP,0x8:平衡栈帧,函数调用前后堆栈位置不能改变 return后ESP的位置在POP1处,所以需要+8。这种在函数外部平衡栈帧的方式称作外平栈。以上图例为两参数相加存储到EAX的过程。
通常而言 EBP+4 EBP+C为参数,而EBP-4为局部数据(缓冲区中数据)
C语言
To Be Continued.