前言
在Linux中,.c文件是如何一步一步转换为可执行文件的?
何为反汇编?
汇编:将汇编文件转化为可执行文件(里面都是机器码00010100……)。那么反汇编就是可执行文件转化为汇编文件。
反汇编方法:
objdump(属于GCC命令,.o和可执行文件都可以)
objdump -d/-D code.o/code (-d:反汇编要执行指令的节;-D:反汇编出所有节)
disassemble(属于GDB命令,只用于可执行文件)
gdb p
disassemble sum(一个函数)
x/11xb sum
汇编格式
(Src:源操作数,Dest:目的操作数)
以下均用AT&T格式。
操作数类型
立即数:$num
寄存器:八个整数寄存器之一
32位下为%eax %ecx %edx %ebx %esi %edi %esp %ebp,%esp和%ebp留作特殊用途
内存地址
寻址方式
详见我的另一博客:CS学习(一)-CSDN博客https://blog.csdn.net/UltraNoah/article/details/136505218
基本操作
在内存和寄存器之间传输数据的传送类指令
mov指令
lea指令
除了传送,lea指令还可用于计算。
对寄存器或内存数据进行操作的运算类指令
(s代指源操作数,d代表目的操作数)
双操作数
addl s d:d += s
subl s d:d -= s
imull s d:d *= s
sall s d:d = d << s(算术左移)
shll s d:d = d << s(逻辑左移)
sarl s d:d = d >> s(算术右移)
shrl s d:d = d >> s(逻辑左移)
xorl s d:d = d ^ s
andl s d:d = d & s
orl s d:d = d | s
单操作数
incl d:d += 1
decl d:d -= 1
negl d:d = -d(各位取反后+1)
notl d:d = ~d(各位取反)
divl:无符号数除法 & idivl:有符号数除法
需要注意的是如果除数位8位,则被除数为16位,默认放在AX中;
如果除数是16位,则被除数为32位,放在DX和AX中(DX存放高字节,AX存放低字节)
合理推理:若除数是32位,则被除数为64位,高32位放在EDX中,低32位放在EAX中。
计算结果:如果除数位8位,则AL存储商 ,AH存储余数;
如果除数为16位,则AX 存储商,DX存储余数。
若除数为32位,则EAX存储商,EDX存储余数。
注意都是对目的操作数操作。
决定程序走向的控制类指令