第三章 程序的机器级表示

1、历史观点

 

2、程序编码

命令gcc---GCC C、C++编译器。是Linux上默认的编译器。

gcc命令调用一系列程序,将源代码转化成可执行代码:

Ø  首先,C预处理器扩展源代码*.c,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。

Ø  然后,编译器产生两个源代码的汇编代码,名字为*.s

Ø  接下来,汇编器将汇编代码转化成二进制目标代码(机器代码的一种形式)文件名为*.o

Ø  最后,衔接器将两个目标代码文件与实现库函数的代码合并,并产生最终的可执行代码文件。

2.1、机器级代码

机器代码:二进制格式

汇编代码:用可读性更好的文本格式来表示。

一条机器指令值执行一个非常基本的操作。

2.2、代码示例

code.c

在命令行上使用“-S”选项,gcc将*.c文件编译器产生汇编代码,产生*.s的可读汇编代码文件

gcc -o1 –S code.c

在命令行上使用“-C”选项,gcc将*.c文件编译并汇编该代码,产生目标代码文件*.o的二进制格式。

gcc –o1 –C code.c

 

反汇编器(disassembler)用于查看目标代码文件的内容,将目标文件反汇编为汇编代码文件*.s

objdump –d code.o

 

生成可执行文件

gcc –o1 –o main.c prog

 

2.3、关于格式的注解

 

3、数据格式

Intel 用术语“字”(word)表示16位数据类型。

32位数为“双字”(double words),64位数为“四字”(quadwords)。

汇编代码指令都有一个字符后缀,表明操作数的大小。

数据传送指令有三个变种:movb传送字节、movw传送字、movl传送双字。

4、访问信息

寄存器:用来存储整数数据和指针。

IA32CPU包含一组8个存储32位值的寄存器。以%e开头。

前6个寄存器是通用寄存器,最后两个寄存器保存指向程序栈中重要位置的指针。

 

4.1、操作数指示符

操作数operand

三种类型:

Ø  立即数(immediate)也就是常数值。

Ø  寄存器(register)表示某个寄存器的内容。

Ø  存储器引用(memory)根据计算出来的地址(寻址方式),访问某个存储器位置。

4.2、数据传送指令

MOV类中的指令,将源操作数的值复制到目的操作数中。

源操作数:指定的值是一个立即数,存储在寄存器或者存储器中。

目的操作数:指定一个位置,寄存器或者存储器地址。

 

程序栈:通过push和pop操作,程序栈存放在存储器中的某个区域。

在C语言中:

Ø  “指针”其实就是地址

Ø  间接引用指针就是将该指针存放在一个寄存器中,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值