CS学习(七)——程序的机器级表达

本文详细介绍了在Linux环境下,.c源代码如何经过编译和反汇编过程转化为可执行文件,重点讲解了objdump和disassemble等工具在反汇编过程中的应用,以及汇编语言中的基本操作和控制指令。
摘要由CSDN通过智能技术生成

前言

在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博客icon-default.png?t=N7T8https://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存储余数。

注意都是对目的操作数操作。

决定程序走向的控制类指令


 

  • 30
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值