汇编语言中的比较、分支、循环与内存数据操作
1. 比较指令
在之前的程序中,判断 %rcx
是否为零是通过加零并检查标志位来实现的,这种方式不够直观。汇编指令集提供了专门的比较指令和跳转指令,以更清晰地进行数值比较。
cmpq
指令(及其相关的 cmpb
、 cmpw
和 cmpl
)用于比较两个数,判断它们的大小关系或是否相等。其内部通过相减操作(但不存储结果)来设置标志位,随后的特殊跳转指令会读取这些标志位,以确定比较结果。
例如,执行 cmpq %rbx, %rax
时,CPU会将 %rax
减去 %rbx
,并设置相应的标志位。标志位能表明 %rbx
和 %rax
是否相等(零标志位被设置)、 %rax
是否大于 %rbx
(标志位被清除)或 %rax
是否小于 %rbx
(相关标志位设置较复杂)。
比较操作可以在寄存器与寄存器、寄存器与特定值或寄存器与内存值之间进行。若比较寄存器与特定值,该值需放在比较指令的前面。
以下是比较指令后的跳转指令及其功能:
| 跳转指令 | 跳转条件 |
| ---- | ---- |
| je
| ARG2