抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

PART1: 计算机系统漫游

  • 组成设备

PART3: 程序的机器级表示

  • 一个可执行程序
    • 编译过程
      • 预处理
      • 编译
      • 汇编
      • 连接
    • 编译细节
      • gcc -O[g|1|2] <file>优化等级
      • 编译器优化可能会调整代码次序,源代码会严重变形,导致并发时不满足顺序一致性内存模型
  • 数据格式
    • 字节,字,双字,四字
    • 数据类型的汇编代码表示
      • b, w, l, q
  • 操作数指示符
    • 操作数可以是立即数值、寄存器值和来自内存的值
    • 立即数的形式$Imm
    • 寄存器的形式%r
    • 内存寻址的形式Imm(rb, ri, si)
      • 表示M[Imm + R[rb] + R[ri]*si,参数是可以省略的,如(,%rcx,)
      • M[]表示取内存值,R[]表示取寄存器值
  • 数据传送指令
    • mov[数据大小]
  • 几类寄存器的格式
    • r[a|b|c|d]xeaxaxal
    • r[s|d]iesisisil
    • r[b|s]pespspspl
    • r[8-9]r8dr8wr8b
    • 简记:有r说明4字、e说明双字、l说明字节,剩下的就说明是单字
  • lea(load effective address)取有效地址
    • leaq 7(%rdi, %rsi, 4), %rax,则%rad=7+R[%rdi]+R[%rsi]*4
    • 处理用在取地址,还可以用在简单的加法和乘法

1
2
3
4
5
6
低地址:
栈顶:%rsp-> | |
| |
.....
栈底 | |
高地址
  • pushq S(4字)
    • R[%rsp] <- R[%rsp]-8,栈顶指针减8
      • 相当于subq $8, %rsp
    • M[R[%rsp]] <- S,入栈
      • 相当于movq %rbp, (%rsp)
    • 区别在于pushq指令编码为1字节
  • 弹出同理
    • 出栈
    • 指针加
  • 知道了栈内存的分布,则可用内存寻址访问栈
    • movq 8(%rsp), %rdx,把栈第二个元素存到rdx寄存器中

运算符

  • 算数运算符
    • 常见的算数运算符有加减乘除,与或非异或,算数(sa[l|r])逻辑(sh[l|r])左右移等
      • 这些运算符都会改变条件码,以实现条件控制
    • 特殊的算数操作
  • 条件码
    • 常用条件码有:
      • CF:进位标志
      • ZF:零标志
      • SF:符号标志
    • 不改变条件码的操作
      • cmp[b|w|l|q],与sub相同,只是不改变条件码
      • test[b|w|l|q],与and相同,只是不改变条件码
    • 访问条件码
      • 根据条件码设置寄存器01,称为set操作,后缀指明 考虑的条件码组合 ,如setl R(set less)将D设为SF^OF

评论