CSAPP L5 Machine-Level Programming I: Basics

这一节主要包括四部分

  • History of Intel processors and architectures
  • C, assembly, machine code
  • Assembly Basics: Registers, operands, move
  • Arithmetic & logical operations

C, assembly, machine code

首先是架构(Architecture)的概念,架构(ISA 指令集架构):指的处理器设计中人们需要理解或编写汇编/机器代码的部分,如寄存器。微架构(Microarchitecture):架构的具体实现,如缓存的大小以及内核频率。

  • 寄存器:可以看作是通过0 到 n-1 或其他地址指定的非常小的内存位置【处理器】
  • 内存:逻辑上可以看作是一个巨大的字节数组,实际上是操作系统和硬件协作的虚构对象。 — 物理内存共享,虚拟内存并行。
  • 缓存:自动加载最近运行的东西,再次访问内存会更快 — 不可见/ 无法通过指令操作、直接访问。

机器码(machine code):处理器执行的字节级别的程序
汇编码(assembly code):机器码的文本表示
Assembly/Machine Code View

C程序编码
教授演示了用 gcc 对 sum.c 编码的过程
在这里插入图片描述
-S 指令命令 gcc 在第一阶段停止,生成文本汇编码
-Og 则对代码进行编译优化,使代码更易阅读

汇编码的一些特性
整形数据: 1,2,4,8 字节 存储不区分符号,无符号
浮点型数据:4,8,10 字节
没有数组等高级数据结构,仅通过在内存中连续分配字节达到这一效果

目标码 .s → .o
每条指令 1byte ~ 15 byte 不等
在这里插入图片描述
*dest = t
movq %rax %rbx
t -> 存储在寄存器中
dest 实际的指针值存储在寄存器中 %rbx
从 %rax 寄存器中取值

sum.s 编译机器码后共 14 byte
生成的二进制文件还可以通过反汇编输出类似的指令集
objdump -d sum
在这里插入图片描述
gdb 调试:

Assembly Basics: Registers, operands, move

在这里插入图片描述
%rsp 栈指针
mov 5种
在这里插入图片描述在这里插入图片描述
D 位移,将地址偏移 D
在这里插入图片描述
(%rcx) 内存地址
在这里插入图片描述
注: movq 与 C语言 赋值操作相反,movq 由左及右,左边为 src,右边为 dest; C语言赋值,由右及左,将等号右边的值赋给左边。

* q 指 4 字,延续用法,8086 年代,一个字 16位 2字节,长字 32 位, 四字 64 位

在这里插入图片描述
例:
在这里插入图片描述

Arithmetic & logical operation

lea :地址运算过程中,写入寄存器的是地址值而不是内存值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述例:
在这里插入图片描述

  • 计算 t4 时先通过 leaq 计算三倍 y【leaq (%rsi,%rsi, 2), %rdx】并存入 % rdx, 再将 %rdx 左移4位 * 2^4【salq $4, %rdx】优化实现。
  • 没有计算 t3,将其直接并入到 t5 的计算中
  • %rax 先后存入 t1, t2, rval. 【inplace 操作】

总结:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值