深入理解计算机系统 C3程序的机器级表示


记录至循环

3.1 历史发展

ISA:指令集架构
IA32,x86-64的32位前身
处理器发展趋势:从32到64位,核数越来越多
大部分32位代码可以在64位机器上跑,但是需要在编译时显式说明。

3.2 程序编码

linux> gcc -Og -o p p1.c p2.c

通过命令gcc使用gcc编译器(Og是优化等级选项),将p1.c和p2.c(源文件)编译为可执行文件p。(-o即翻译成机器语言)
在这里插入图片描述
类似地,在命令行上使用"-S"选项,就能得到源文件对应的汇编代码。

objdum -d sum 

对sum文件进行反汇编,得到的代码可能跟源文件有一定出入。

3.3 数据格式

Inter用“字”表示16位数据类型,32位为“双字”,64位为“四字”
在这里插入图片描述

3.4 访问信息

寄存器:
在这里插入图片描述
如果移动1字节或2字节到一个寄存器中,寄存器原来高字节中的内容不变;如果移动4个字节,则原来的高位会被清零。

3.4.1 操作数指示符

操作数有三种:立即数,寄存器(%rsp被特殊保留),内存引用
在这里插入图片描述

3.4.2 数据传送指令

move指令:
在这里插入图片描述
规则:

  1. 内存里的数据不可以直接传送到数据中,只能通过寄存器传送。
  2. movabsq:传送64位立即数,常规的movq指令只能将32位补码数字的立即数作为源操作数,移动后进行符号扩展。movabsq能以64位立即数作为源操作数,并且只能以寄存器作为目标。
  3. 目标和源的字节数都要和指令匹配

在这里插入图片描述
cltq:只用于把%rax的一半扩展到全部,因为这个寄存器用的比较多所以专门设置了一个指令

3.4.3 数据传送示例

%rax中保存返回值

压入和弹出栈数据

在这里插入图片描述
在这里插入图片描述
*栈从上往下增长,类似于钟乳石。“

3.5 算术和逻辑操作

在这里插入图片描述

3.5.1 加载有效地址

实际上并没有引用内存,而是将有效地址写到目的操作数(必须是寄存器),常用于描述普通的算数计算,效率较高。

3.5.4 讨论

xorq %rax,%rax//即把%rax的值设为0

3.5.5 特殊的算数操作*

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200428135936877.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaV9zaGl6dWth,size_16,color_FFFFFF,t_70

3.6 控制

3.6.1 条件码

在这里插入图片描述
会设置条件码的操作:

  1. 除了leaq之外的算术运算指令
  2. 比较和测试指令(如下)
    在这里插入图片描述
    test和cmp指令仅设置条件码而不改变寄存器的值

set指令:
在这里插入图片描述
set指令的目的操作数是寄存器的低位单字节,指令将这个字节设置为0或1。

3.6.3 跳转

在这里插入图片描述

3.6.4 跳转指令的编码:pc相对寻址

用下一行指令的地址+本行最后一个字节的补码值=将要跳转到的指令,这种方式称为相对寻址,便于移植。

3.6.5 用条件控制实现条件分支

有两种方式:条件控制和条件传送

  1. 条件控制:通过判定条件码来决定是否跳转到另外的指令
    在这里插入图片描述

3.6.6 用条件传送实现条件分支

在这里插入图片描述在这里插入图片描述
在现有的流水线指令集中,条件传送能够达到比条件控制更好的性能。但并不是所有的条件控制都能用条件传送实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值