3.5.2 一元和二元操作
3.5.2 一元和二元操作
第二组中的操作是一元操作,只有一个操作数,既是源又是目的。这个操作数可以是一个寄存器,也可以是一个内存位置。比如说,指令 incq (%rsp) 会使栈顶的 8 字节元素加 1。这种语法让人想起 C 语言中的加 1 运算符(++)和减 1 运算符(--)。
第三组是二元操作,其中,第二个操作数既是源又是目的。这种语法让人想起 C 语言中的赋值运算符,例如 x -= y。不过,要注意,源操作数是第一个,目的操作数是第二个,对于不可交换操作来说,这看上去很奇特。例如,指令 subq %rax,%rdx 使寄存器 %rdx 的值减去 %rax 中的值。(将指令解读成“从 %rdx 中减去 %rax”会有所帮助。)第一个操作数可以是立即数、寄存器或是内存位置。第二个操作数可以是寄存器或是内存位置。注意,当第二个操作数为内存地址时,处理器必须从内存读出值,执行操作,再把结果写回内存。
练习题 3.8 假设下面的值存放在指定的内存地址和寄存器中:
| 地址 | 值 |
|---|---|
0x100 |
0xFF |
0x108 |
0xAB |
0x110 |
0x13 |
0x118 |
0x11 |
| 寄存器 | 值 |
|---|---|
%rax |
0x100 |
%rcx |
0x1 |
%rdx |
0x3 |
填写下表,给出下面指令的效果,说明将被更新的寄存器或内存位置,以及得到的值:
| 指令 | 目的 | 值 |
|---|---|---|
addq %rcx,(%rax) |
||
subq %rdx,8(%rax) |
||
imulq $16,(%rax,%rdx,8) |
||
incq 16(%rax) |
||
decq %rcx |
||
subq %rdx,%rax |