Posts 三、程序的机器级表示
Post
Cancel

三、程序的机器级表示

机器级代码

调用者保存 vs. 被调用者保存

如下图所示,func_A中会调用func_B调用者保存就是在func_A中调用func_B之前保存rbx寄存器值,调用funcB之后恢复rbx值;被调用者保存就是在被调用函数func_B中使用rbx寄存器之前保存rbx,在使用rbx之后恢复rbx

image-20220306213421564

访问信息

一个x86-64的CPU包含一组16个64-bit的通用目的寄存器,这些寄存器用来存储整数数据和指针。每个寄存器都有特殊的用途

  • 被调用者保存寄存器:%rbx%rbp%r12%r13%r14%r15
  • 调用者保存寄存器:%r10%r11%rax%rdi%rsi%rdx%rcx%r8%r9

image-20220306215211849

Intel汇编格式 vs. AT&T汇编格式

  • Intel省略了指示大小的后缀。比如pushmov,而不是pushqmovq
  • Intel省略了寄存器名前面的%符号,用的是rbx,而不是%rbx
  • Intel用不同的方式描述内存中的位置,例如QWORD PTR [rbx],而不是(%rbx)
  • 在带有多个操作数的情况下,列出操作数的顺序相反。

操作数指示符

下图第一列展示了不同的操作数类型:

  • 立即数
  • 寄存器
  • 内存引用

最后一列展示了不同的寻址模式:

  • 立即数寻址
  • 寄存器寻址
  • 绝对寻址
  • 间接寻址
  • (基址+偏移量)寻址
  • 变址寻址
  • 比例变址寻址,注意比例因子s必须是1,2,4或8。编译器根据数组元素的类型确定比例因子的值。char型就是1,int型就是4。

image-20220306220325350

数据传送指令

x86-64加了一条限制,传送指令的两个操作数不能都指向内存。将值从一个内存位置复制到另一个内存位置需要两条指令:1. 将源值加载到寄存器中;2. 将该寄存器值写入到目的内存。

This post is licensed under CC BY 4.0 by the author.

Forecasting at Scale总结

二、信息的表示和处理