一、
生成汇编文件 .s :gcc -O1 -S code.c
生成机器码文件 .o :gcc -O1 -c code.c
生成可执行文件 : gcc -O1 -o code.c main.c
反汇编: objdump -d code.o
同一段代码。单个文件生成的.o文件的反汇编码和链接后可执行程序的反汇编码一致,不同在于地址偏移不一样,,单个文件的偏移是相对于他自己这个文件的,从0开始。
二、
汇编后缀: b = 字节 w = 字 l = 双字 或 double s = float
8 个寄存器 : 6 通用 eax、ecx 、edx 、ebx 、edi 、esi + 2 个 特殊
EBP存储着当前函数栈底的地址,栈低通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址(很重要)。
ESP就是前面说的,始终指向栈顶,只要ESP指向变了,那么当前栈顶就变了
操作数: 1 、立即数 $ 2、寄存器 3、存储器引用(多种寻址模式)
三、
if else 在汇编层次用 jmp ,无论是否有else ,都会生成else 的汇编分支
while ,for , do while ,汇编层次都按 do while 模式进行生成,只是初始化部分,while for 会有额外的先行判断
四、
linux 对齐:2字节数据类型的地址必须是2的倍数,,较大的数据类型地址必须是4的倍数
windows对齐:任何K字节基本对象的地址必须是K 的倍数, k=2\4\8
五、
缓冲区溢出:会导致栈信息错误,可以被作为攻击手段:输入给程序一段字符串,这个字符串包含一些可执行代码的字节编码(攻击代码),还有一些字节用一个执行攻击代码的指针覆盖返回地址。
对抗攻击:栈随机化,每次运行,同一个代码的对象栈地址是不一样的;栈保护机制;限制可执行代码区域
六、
指令编码:汇编指令都有固定的字节级编码,而每种指令需要的额外参数等的长度也应该固定。也就是说,任意的字节序列要么是唯一的指令序列编码,要么就不是合法的,这样才能保证无二义性,只要从第一个字节开始处理,就可以确定所有的指令序列。
CISC:复杂指令集计算机
RISC:精简指令集计算机
七、
取指 、译码 、 执行AUL 、访存 、 写回、 更新PC
流水线技术。。。