程序的机器级表示:寻址方式、指令及栈的运行机制 (2)

支持两个 64 位数字的全 128(8字, oct word) 位乘积以及整数除法的指令, 可以看到除法是分步对高低64位操作的
指令 | 效果 | 描述
-|-|-
\(imulq \quad S\)| \(R[\%rdx]:R[\%rax] \leftarrow S \times R[\%rax]\) | 有符号全乘法
\(mulq \quad S\)| \(R[\%rdx]:R[\%rax] \leftarrow S \times R[\%rax]\) | 无符号全乘法
\(clto \quad S\)| \(R[\%rdx]:R[\%rax] \leftarrow 符号扩展R[\%rax]\) | 转换为8字
\(idivq \quad S\)| \(R[\%rdx] \leftarrow R[\%rdx]:R[\%rax] mod S \\ R[\%rdx] \leftarrow R[\%rdx]:R[\%rax] \div S\) | 有符号除法法
\(divq \quad S\)| \(R[\%rdx] \leftarrow R[\%rdx]:R[\%rax] mod S \\ R[\%rdx] \leftarrow R[\%rdx]:R[\%rax] \div S\) | 无符号除法法

控制 条件码

\(CF\): 进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出。

\(ZF\): 零标志。最近的操作得出的结果为 0.

\(SF\): 符号标志。最近的操作得到的结果为负数

\(OF\): 溢出标志。最近的操作导致一个补码溢出(正溢出或者负溢出)

条件码会发生改变的操作

比较和测试指令

这两个系列指令不修改任何寄存器的值,只设置条件码
指令 | 效果 | 描述
-|-|-
\(CMP \quad S_1, S_2\) | \(S_2-S_1\) | 比较
\(TEST \quad S_1, S_2\) | \(S_1 \& S_2\) | 测试

访问条件码 指令 同义名 效果 描述
\(sete \quad D\)   \(setz\)   \(D \leftarrow ZF\)   相等/零  
\(setne \quad D\)   \(setnz\)   \(D \leftarrow \sim ZF\)   不等/非零  
\(sets \quad D\)     \(D \leftarrow SF\)   负数  
\(setns \quad D\)     \(D \leftarrow \sim SF\)   负数  
\(setg \quad D\)   \(setnle\)   \(D \leftarrow \sim(SF \land OF) \& \sim ZF\)   大于(有符号>)  
\(setge \quad D\)   \(setnl\)   \(D \leftarrow \sim(SF \land OF)\)   大于等于(有符号 >=)  
\(setl \quad D\)   \(setnge\)   \(D \leftarrow SF \land OF\)   小于(有符号<)  
\(setle \quad D\)   \(setng\)   \(D \leftarrow \sim(SF \land OF) \mid ZF\)   小于等于(有符号 <=)  
\(seta \quad D\)   \(setnbe\)   \(D \leftarrow \sim CF \& \sim ZF\)   大于(无符号>)  
\(setae \quad D\)   \(setnb\)   \(D \leftarrow \sim CF\)   大于等于(无符号>=)  
\(setb \quad D\)   \(setnae\)   \(D \leftarrow CF\)   小于(无符号<)  
\(setbe \quad D\)   \(setna\)   \(D \leftarrow CF \mid ZF\)   小于等于(无符号<=)  
跳转指令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpygjw.html