深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令)

目录

  • 1. 寄存器
  • 2. 操作数指示符
  • 3. 数据传送指令MOV家族
    • 简单指令
    • 数据移动指令
  • 4. 压入和弹出栈数据
  • 5. 算数和逻辑操作
    • 5.1 加载有效地址-leadq
    • 5.2 位移操作
    • 5.3 特殊的算数操作

1. 寄存器

x86-64位CPU的16个64位通用目的寄存器。如图:

在这些16个通用寄存器中%rsp是栈指针,用来说明运行时栈的结束位置。
备注:
有很多汇编指令会复制和生成1字节、2字节、4字节和8字节值。当这些指令以寄存器为目标时对于生成小于8字节结果的指令会有两条处理规则:
1. 生成1字节、2字节的指令会保持剩下的字节不变;
2. 生成4字节的指令会把高位4字节置为0。

2. 操作数指示符

3. 数据传送指令MOV家族

限制:
传送指令的两个操作数不能都指向内存位置,如果有该操作需要将源值加载到寄存器,再将寄存器值写入目的位置。

简单指令

深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令)_第1张图片
说明:

  1. 寄存器部分的大小必须与指令最后一个字符(b、w、l或q)指定的大小匹配,内存没有此限制。例如:movb $-17,(%rsp)//内存、movb $-17,%al//寄存器
  2. 大多数MOV指令只会更新目的操作数指定的字节大小,唯一例外是movl指令以寄存器为目的时,会把寄存器的高位4自己设置为0。
  3. movabsq只能以寄存器作为目的。

数据移动指令


这两类指令都是将较小的源值复制到较大的目的时使用。
说明:

  1. 源数据可以是内存或者寄存器,目的数据必须是寄存器。

4. 压入和弹出栈数据

深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令)_第2张图片

5. 算数和逻辑操作

深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令)_第3张图片
说明:
这些指令中都有各种不同大小操作数的变种(leaq除外)。比如:addb、addw、addl、addq。

5.1 加载有效地址-leadq

注意:该指令的目的操作数必须是寄存器。
例如:深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令)_第4张图片

 movq $7(%rax, %rbx), %rcx

该操作执行完后%rcx的值为:0x9,及内存0x108的值。

leadq $7(%rax, %rbx), %rcx

该操作执行完后%rcx的值为:0x10F,及%rax+%rbx+$7。

5.2 位移操作

备注:

  1. 第一个操作数(位移量)可以是一个立即数,或者放在单字节寄存器%cl中。
  2. 目的操作数可以是一个寄存器或者内存。

5.3 特殊的算数操作

深入理解计算机系统(第三版)读书笔记一(寄存器、操作数、MOV、出入栈、算数、逻辑指令)_第5张图片

你可能感兴趣的:(计算机基础)