惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

faryou的博客

5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】更灵活的定位内存 【汇编基础教程】理解一下[bx]和loop指令 faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【汇编基础教程】跳一跳!
作者: faryou · 2026-01-30 · via faryou的博客

前言

我们在前面已经学习了编写有多个段的程序,但是目前学习的内容中没有可以用于在不同段之间转移的指令。下面我们学习如何在不同的段之间“跳一跳”~

前置知识:伪指令offset

offset是用于获得某标号处在内存中的偏移地址的伪指令,使用格式:

offset 标号

它可以帮助我们在编程时快速调用标号的地址(否则我们需要手动数某处代码在内存中的位置,那就太麻烦了)。

转移指令的原理

所有转移指令原理相同,都是通过修改CS:IP的值实现转移(关于CS:IP详见8086CPU工作原理)。

jmp无条件转移指令

jmp是无条件转移指令。所谓“无条件”是指跳转前不进行判断,直接转移。jmp有多种使用格式,下面分别进行说明:

jmp short 标号
jmp near ptr 标号

以上二指令用于跳转到标号处(需要注意的是,本用法对应的机器码中不通过直接指定地址来进行跳转,而是通过跳转目标与当前地址的偏移差进行跳转,偏移差在编译时就已计算完成,方便兼容)。其中jmp short用于进行8位位移(即支持位移到当前指令前后范围为-128~127),jmp near ptr用于进行16位位移(即支持位移到当前指令前后范围为-32768~32767)。本指令仅修改IP的值。

jmp far ptr 标号

上面的指令用于段间转移,会同时改变CS:IP的值。当目标位置与当前位置不在同段中可用本指令。
上述指令中的目标位置均在编程时指定,若转移目标的地址存放在寄存器中或内存中时,应使用下面的指令:

jmp 16位寄存器名

该指令可以转移到16位寄存器中存放的地址,仅修改IP的值。

jmp word ptr 内存单元地址
jmp dword ptr 内存单元地址

上面两条指令的目标地址存放在内存单元中,其中jmp word ptr用于段内转移,只修改IP的值;jmp dword ptr用于段间转移,会同时修改CS:IP的值,其中目标地址后的第一个字存放目标段地址,第二个字存放目标偏移地址。

jcxz指令

前面的jmp指令为无条件转移指令,接下来介绍的jcxz指令为有条件转移指令。格式:

jcxz 标号

jcxz为短转移指令,仅支持自身位置上下128位内的转移。jcxz会判断cx的值是否为0,若为0则转移,不为零则向下执行。

再谈loop

关于loop,我在之前的理解一下[bx]和loop指令中介绍过了,不再详细说明,这里再补充一下,loop也为短转移指令(同jcxz)。

转移指令在编译时的原理
我们已经知道,jmp short、jcxz等指令只支持8位位移。编译器在编译这些指令时会直接计算好偏移地址增加量,故而在debug中看不到真实地址名。同理,jmp near ptr、jmp word ptr只支持16位位移,编译器也会计算好偏移量。只有对于段间转移地址,编译器会将目标地址写入代码。
因此,当段间转移指令中的目标地址超范围时,编译器会直接报错。