转载自:
https://www.csdn.net/tags/MtjaIg1sNDE1MDYtYmxvZwO0O0OO0O0O.html
https://www.csdn.net/tags/MtjaIg1sNDE1MDYtYmxvZwO0O0OO0O0O.html
正常执行的情况下,指令按照它们出现的顺序一条一条地执行。跳转(jmp)指令会导致执行切换到程序中一个全新的位置。
在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。
考虑下面的汇编代码序列:
movq $0, %rax
jmp .L1
movq (%rax), %rdx
.L1:popq %rdx
指令jmp .L1会导致程序跳过movq指令,而从popq指令开始继续执行。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部分(所以是间接跳转)。
下表列举了不同的跳转指令。jmp指令是无条件跳转。它可以是直接跳转,即跳转目标是作为指令的一部分编码的;也可以是间接跳转,即跳转目标是从寄存器或内存位置中读出的。汇编语言中,直接跳转是给出一个标号作为跳转目标的,例如上面的例子中标号.L1。
间接跳转的写法是*后面跟一个操作数指示符。举个例子:
指令jmp *%rax用寄存器%rax中的值作为跳转目标。
指令jmp *(%rax)以%rax中的值作为读地址,从内存中读出跳转目标。
| 指令 | 同义名 | 跳转条件 | 描述 |
|---|---|---|---|
| jmp Label | 1 | 直接跳转 | |
| jmp *Operand | 1 | 间接跳转 | |
| je Label | jz | ZF | 相等/零 |
| jne Label | jnz | ~ZF | 不相等/非零 |
| js Label | SF | 负数 | |
| jns Label | ~SF | 非负数 | |
| jg Label | jnle | ~(SF ^ OF) & ~ZF | 大于(有符号>) |
| jge Label | jnl | ~(SF ^ OF) | 大于或等于(有符号>=) |
| jl Label | jnge | SF ^ OF | 小于(有符号<) |
| jle Label | jng | (SF ^ OF) | ZF | 小于或等于(有符号<=) |
| ja Label | jnbe | ~CF & ~ZF | 超过(无符号>) |
| jae Label | jnb | ~CF | 超过或相等(无符号>=) |
| jb Label | jnae | CF | 低于(无符号<) |
| jbe Label | jna | CF | ZF | 低于或相等(无符号<=) |
表中所示的其他跳转指令都是有条件的——它们根据条件码的某种组合,或者跳转,或者继续执行代码序列中下一条指令。













![Go语言WEB开发[html/template包]](https://img-blog.csdnimg.cn/c1edb049bfd841c09cffb0006a02bef0.png)



