交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
2 跳转指令jmp
分享
未结
0
824
李延
LV6
2022-06-07
悬赏:20积分
# 1 跳转 前面我们了解了条件码,而下面我们介绍跳转指令,并且根据前面学习的条件码进行有条件的跳转,实现分支控制。 # 2 jmp 指令 jmp表示无条件的跳转至指定的代码行。 我们首先看下面的代码: ```asm .LC0: .string "Hello, World!\n" .LC1: .string "JMP TO .JMPLINE!\n" .globl main main: subq $8, %rsp jmp .jmpline movl $.LC0, %edi call printf .jmpline: movl $.LC1, %edi call printf movl $0, %eax addq $8, %rsp ret ``` 在上面的代码中除了多了jmp与 和main一样的一个jmpline 外,其他与我们最开始的Hello, World! 一致。 如果不考虑多出来的两行代码,执行结果将是输出: ```shell Hello, World! JMP TO .JMPLINE! ``` 而通过jmp 命令 ,他讲直接跳转到`jmpline:` 所指定的下面开始运行,跳过中间打印`Hello, World! `。 正式的执行结果如下: ```shell JMP TO .JMPLINE! ``` # 3 其他跳转指令 除了jmp表示没有条件的跳转,还有以下的跳转指令,和我们上一节所讲的set指令是一一对应的。 | 指令 | 同义名 | 效果 | 含义 | | :--- | ------ | --------------- | ---------- | | je | jz | ZF | 相等 | | jne | jnz | ~ZF | 不相等 | | js | | SF | 负数 | | jns | | ~SF | 非负 | | jg | jnle | ~ (SF^OF)& ~ ZF | 大于 | | jge | jnl | ~ (SF^OF) | 大于等于 | | jl | jnge | (SF^OF) | 小于 | | jle | jng | (SF^OF) \| ZF | 小于等于 | | ja | jnbe | ~CF & ~ ZF | 超过 | | jae | jnb | ~CF | 超过或相等 | | jb | jnae | CF | 低于 | | jtbe | jna | CF \| ZF | 低于或等于 | # 4 示例 我们以c语言的if语句,展示跳转的过程。 ### 4.1 c语言代码 ```asm #include <stdio.h> void sum(int a, int b) { if (a > b) { printf("a>b"); } else { printf("a<=b"); } } int main() { sum(1, 2); return 0; } ``` 我们这里看到在sum 函数中, 通过对比a和b的值,来判断打印对于字符串。而这里我们调用的时 a=1,b =2打印的应该是 a<=b ### 4.2 对应汇编代码 ```asm .LC0: .string "a>b" .LC1: .string "a<=b" sum: .LFB11: subq $8, %rsp cmpl %esi, %edi jle .L2 movl $.LC0, %edi movl $0, %eax call printf jmp .L1 .L2: movl $.LC1, %edi movl $0, %eax call printf .L1: addq $8, %rsp ret .globl main main: subq $8, %rsp movl $2, %esi movl $1, %edi call sum movl $0, %eax addq $8, %rsp ret ``` 首先main函数没有什么特殊,不做说明,主要是看sum 首先是 ```asm cmpl %esi, %edi ``` cmp 在之前的条件码章节中做了说明,就是一个减法的指令,不过只是设置条件码。我们可以看到对于大小值的判断,在汇编中会被转换为减法操作。 而后是一个跳转指令jle ```asm jle .L2 ``` jle是指当条件码 小于等于 时,跳转到 .L2上。否则就继续执行 我们看到下面跟着的就是我们c语言中对于if为ture的语句,而.L2后面跟着的是为false的情况。刚好就是我们c语言中不同分支的情况。 并且在.L2的上面,是一个直接跳转的指令jmp。也就是说if为ture的代码指令执行完后,直接跳转到.L1这里,跳过if为false的指令。
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号