📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。 本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。
可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制 CPU 执行内存中某处代码的指令。
8086CPU 的转移行为有以下几类。
jmp ax
。
jmp 1000:0
。
由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移
8086CPU的转移指令分为以下几类:
这些转移指令转移的前提条件可能不同,但转移的基本原理是相同的。我们在这一章主要通过深入学习无条件转移指令jmp来理解 CPU执行转移指令的基本原理。
操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
比如下面的程序:
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条指令,使该程序在运行中将s处的一条指令复制到s0处。
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
思考后看分析。
(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个字。
程序如下。
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
jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP;
jmp指令要给出两种信息:
不同的给出目的地址的方法,和不同的转移位置,对应有不同格式的jmp指令。 下面的几节内容中,我们以给出目的地址的不同方法为主线,讲解jmp指令的主要应用格式和CPU 执行转移指令的基本原理。
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。