The Hardware Software Interface Section 3 Basics of Architecture Machine Code
课程主页:https://courses.cs.washington.edu/courses/cse351/16sp/
课程资料:
实验部分:https://github.com/vuquangtrong/HW-SW_Interface_Course
实验说明:https://courses.cs.washington.edu/courses/cse351/13sp/lab-0.html
课件:http://academictorrents.com/details/b63a566df824b39740eb9754e4fe4c0140306f4b
课程视频:https://www.bilibili.com/video/BV1Zt411s7Gg?from=search&seid=8781593976070799647
这次回顾第三部分,这部分介绍了ISA。
第3节:架构基础,机器编程
什么是ISA(指令集体系结构)?
ISA(指令集体系结构)
- ISA定义:
- 系统状态(例如寄存器,内存,程序计数器)
- CPU可执行的指令
- 每个指令中对系统状态产生的影响
ISA的一般设计决策
- 指令
- 有哪些指令可用? 它们在做什么?
- 它们如何编码?
- 寄存器
- 有多少个寄存器?
- 它们有多宽?
- 存储器
- 如何指定存储器的位置?
C,汇编,机器码
基本定义
- 体系结构:(也是指令集体系结构或ISA),编写汇编代码需要理解的处理器设计部分。
- “软件直接可见的内容”
- 微体系结构:体系结构的实现
汇编/机器代码视图
程序员可见状态
- PC:程序计数器
- 下一条指令的地址
- 称为“RIP”(x86-64)
- 内存
- 字节数组
- 代码和用户数据
- 堆叠起来以支持程序
- 寄存器
- 大量使用的程序数据
- 条件码
- 存储有关最新算术或逻辑运算的状态信息
- 用于条件分支
将C转换为目标代码
- 文件中的代码p1.c,p2.c
- 使用命令编译:gcc -Og pl.c p2.c -o p
- 使用基本优化(-Og)
- 二进制结果在文件p中
三种基本指令
- 对寄存器或存储器数据执行算术功能
- 在存储器和寄存器之间传输数据
- 将数据从内存加载到寄存器
- 将寄存器数据存储到内存中
- 转移控制
- 程序无条件跳转
- 条件分支
汇编码特征:数据类型
- 1、2、4或8个字节的“整数”数据
- 数据值
- 地址(无类型的指针)
- 4、8或10个字节的浮点数据
- 代码:字节序列编码的一系列指令
- 没有例如数组或者结构之类的聚合类型的结构
- 只是在内存中连续分配字节
目标代码
sumstore的目标代码:
0x0400595:
0x53
0x48
0x89
0xd3
0xe8
0xf2
0xff
0xff
0xff
0x48
0x89
0x03
0x5b
0xc3
- 汇编器
- 将.s转换成.o
- 将每个指令转换为二进制编码
- 几乎是可执行代码
- 不同文件中的代码之间缺少链接
- 连接器
- 解决文件之间的引用
- 与静态运行库结合
- 例如,malloc,printf的代码
- 一些库是动态链接的
- 程序开始执行时发生连接
机器指令例子
C代码
```c
*dest = t;- 将t存储到dest的位置 - 汇编码 - ``` movq %rax, (%rbx)
将8字节的值移到内存中
操作数:
- t:寄存器%rax
- dest:寄存器%rbx
- *dest:内存M[%rbx]
目标码
- ```assembly
0x40059e: 48 89 03- 3字节指令 - 存储在地址0x40059e ##### 反汇编目标代码 目标码很难阅读,可以利用反汇编器生成方便阅读的内容: ```assembly 0000000000400595 <sumstore>: 400595: 53 push %rbx 400596: 48 89 d3 mov %rdx,%rbx 400599: e8 f2 ff ff ff callq 400590 <plus> 40059e: 48 89 03 mov %rax,(%rbx) 4005a1: 5b pop %rbx 4005a2: c3 retq
- ```assembly
反汇编器
- ```shell
objdump –d sum- 检查目标代码的有用工具 - 分析一系列指令的位模式 - 产生近似的汇编代码 - 可以在a.out(完整的可执行文件)或.o文件上运行 - 那些文件可以被反汇编 - 任何可以解释为可执行代码的文件 - 反汇编程序检查字节并重建汇编源 - 例如反汇编word ```assembly objdump -d WINWORD.EXE
- ```shell
还可以使用gdb工具来反汇编:
gdb p
disassemble sum
(disassemble function)
x/13b sum
(examine the 13 bytes starting at sum)
x86基础:寄存器
什么是寄存器
- CPU中存储少量数据的位置,可以非常快速地(每个时钟周期一次)对其进行访问
- 寄存器是汇编编程的核心
- 它们是所有体系结构中的宝贵商品,尤其是x86
X86-64寄存器
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere