逻辑运算

计算的本质:

计算2+3:

image-20211207194513615

  1. 计算两个值的异或和与,如果与运算左移一位后为零,则异或值为最终结果,否则进入第二步

    image-20211207194903247

  2. 上一步的异或和与值作为新的两个值,同样计算异或和与值,重复以上步骤直至与值为0,则异或值为最终结果

eg:2-3

  1. 即0010+1101 xor:1111 & :0000 与值为零 最终结果为1111 即-1

通用寄存器:

image-20211207201624715image-20211207205234599image-20211207205358016

image-20211207205611238

源操作数和目标操作数不能同时为内存,目标操作数不能为立即数

寄存器和内存:

image-20211207205904912

image-20211207213725260

image-20211207213735127

反汇编和寄存器界面将内存数据高位在前储存,而实际上内存在计算机中的编号如地址界面

内存寻址

image-20211207214115727

image-20211207214625490

image-20211207214702976

image-20211207215003035

image-20211207215119835

堆栈结构

image-20211207215819330

PUSH POP LEA

可以看作是 赋值+抬升/降低栈顶指针ESP的结合

对32位寄存器/立即数的push/pop 会使指针改变4位

对16位寄存器 2位

不允许push/pop 8位寄存器

push/pop r/m 16/32

LEA 取地址

标志寄存器

image-20211217194715806

image-20211217194740423

image-20211217201942571

mov指令不改变标志寄存器的值

af cf区别:cf只关注最高位的进位 af关注 字节/4位 的进位

cf of区别: cf无符号计算 of有符号计算

ADC及相关指令

image-20211217204127116

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

image-20211217214455584

call=jmp+push(call下一个地址即返回地址)(压栈) 表现为EIP和ESP变化 类似调用函数?

return =jmp+pop(EIP)对应于call

image-20211217220135241

image-20211217220625915

image-20211217221051451

Less&Greater为有符号数 Below&Above为无符号数

绘制堆栈图

ctrl+G跳转 相应位置

image-20211219200421946

将两个参数压入栈中

image-20211219200506407

调用函数并将返回地址压入栈中,保存当前栈底

image-20211219200646253

提升栈底,提升栈顶创建缓冲区,保存现场将EDI,ESI,EBX压入栈

image-20211219200830966

取出目标地址给EDI,赋值ECX为10,重复储存10次EAX值到EDI处,赋值/加参数给EAX

image-20211219201303246

三个寄存器值出栈,还原现场,压下栈顶到栈底处,栈底出栈还原

image-20211219201452834

POP EIP函数调用结束返回

image-20211219210422241

ADD ESP,0x8:平衡栈帧,函数调用前后堆栈位置不能改变 return后ESP的位置在POP1处,所以需要+8。这种在函数外部平衡栈帧的方式称作外平栈。以上图例为两参数相加存储到EAX的过程。

image-20211219210122709

通常而言 EBP+4 EBP+C为参数,而EBP-4为局部数据(缓冲区中数据)

C语言

image-20211223205752746

To Be Continued.