前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【汇编语言】转移指令的原理(一) —— 新手必看:3步掌握汇编语言中的跳转

【汇编语言】转移指令的原理(一) —— 新手必看:3步掌握汇编语言中的跳转

作者头像
Crossoads
发布2024-11-21 15:36:18
发布2024-11-21 15:36:18
26000
代码可运行
举报
文章被收录于专栏:汇编语言汇编语言
运行总次数:0
代码可运行

前言

📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。 本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

1. 转移指令

1.1 什么是转移指令?

可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制 CPU 执行内存中某处代码的指令。

1.2 转移行为的分类

8086CPU 的转移行为有以下几类。

  • 只修改IP 时,称为段内转移,比如:jmp ax
  • 同时修改CS和IP时,称为段间转移,比如:jmp 1000:0

由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移

  • 短转移 IP 的修改范围为:-128~127.
  • 近转移 IP 的修改范围为:-32768~32767。

1.3 转移指令的分类

8086CPU的转移指令分为以下几类:

  • 无条件转移指令 (如:jmp)
  • 条件转移指令
  • 循环指令(如:loop)
  • 过程
  • 中断

这些转移指令转移的前提条件可能不同,但转移的基本原理是相同的。我们在这一章主要通过深入学习无条件转移指令jmp来理解 CPU执行转移指令的基本原理。

2. 操作符 offset

2.1 如何使用 offset

操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址

比如下面的程序:

代码语言:javascript
代码运行次数:0
复制
assume cs:codesg

codeseg segment
	start:mov ax,offset start 	; 相当于mov ax,0
		s:mov ax,offset s      	; 相当于mov ax,3
codesg ends

end start

在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3,所以指令:mov ax,offset start 相当于指令 mov ax,0,因为 start 是代码段中的标号,它所标记的指令是代码段中的第一条指令,偏移地址为0;

mov ax,offset s相当于指令 mov ax,3,因为s是代码段中的标号,它所标记的指令是代码段中的第二条指令,第一条指令长度为3个字节,则s的偏移地址为3。

2.2 问题

有如下程序段,添写2条指令,使该程序在运行中将s处的一条指令复制到s0处。

代码语言:javascript
代码运行次数:0
复制
assume cs:codesg
 codesg segment
   s:  mov ax,bx              	;(nop的机器码占一个字节)
       mov si,offset s
       mov di,offset s0
       __________
       __________
 s0:   nop                       ;(nop的机器码占一个字节)
       nop
 codesg ends
ends

思考后看分析。

2.3 问题的分析与求解

2.3.1 分析

(1)s和s0处的指令所在的内存单元的地址是多少?

cs:offset s 和cs:offset s0。

(2)将s处的指令复制到s0处,就是将cs:offset s 处的数据复制到cs:offset s0处;

(3)段地址已知在cs中,偏移地址offset s和offset s0已经送入si和di中;

(4)要复制的数据有多长?

mov ax,bx指令的长度为两个字节,即1个字。

2.3.2 程序实现

程序如下。

代码语言:javascript
代码运行次数:0
复制
assume cs:codesg
 codesg segment
   s: mov ax,bx           		;(mov ax,bx 的机器码占两个字节)
      mov si,offset s
      mov di,offset s0
      mov ax,cs:[si]
      mov cs:[di],ax
 s0:  nop                     	;(nop的机器码占一个字节)
      nop
 codesg ends
 ends

3. jmp 指令

jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP;

jmp指令要给出两种信息:

  • 转移的目的地址
  • 转移的距离(段间转移、段内短转移,段内近转移)

不同的给出目的地址的方法,和不同的转移位置,对应有不同格式的jmp指令。 下面的几节内容中,我们以给出目的地址的不同方法为主线,讲解jmp指令的主要应用格式和CPU 执行转移指令的基本原理。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1. 转移指令
    • 1.1 什么是转移指令?
    • 1.2 转移行为的分类
    • 1.3 转移指令的分类
  • 2. 操作符 offset
    • 2.1 如何使用 offset
    • 2.2 问题
    • 2.3 问题的分析与求解
      • 2.3.1 分析
      • 2.3.2 程序实现
  • 3. jmp 指令
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档