汇编语言学习第九章-转移指令的原理

本博文系列参考自<<汇编语言>>第三版,作者:王爽

可以修改IP寄存器的值,或者同时修改CS与IP的值的指令称为转移指令。转移指令的功能就是使得CPU执行内存中某段特定的指令或程序。

8086CPU的转移行为分为如下几类;

1.只改变IP值,称为段内转移。比如 jmp ax;段内转移又分为短转移和近转移。短转移IP的修改范围为-128~127,近转移IP的修改范围为-32768~32767.

2.同时改变CS:IP的值称为段间转移。比如 jmp 1000:0

8086CPU的转移指令分为如下几种:

无条件转移指令:jmp

条件转移指令

循环指令

过程

中断

本次博文主要介绍jmp指令

9.1 操作符offset

offset为伪指令,该指令由编译器解释。offset的作用是取得标号的偏移地址.比如:

<pre name="code" class="plain">assume cs:codesg
codesg segment
           start: mov ax,offset start  含义:相当于mov  ax,0
               s:  mov ax,offset s     含义:相当于mov  ax,3
codesg ends
end start

9.2  jmp指令

jmp为无条件转移指令,可以只修改IP寄存器的值,也可以同时修改CS与IP的值。

jmp指令要给出两种信息:

(1)转移的目的地址

(2)转移的距离(段间转移,段内短转移,段内近转移)

9.3依据位移进行转移的jmp指令

jmp short 标号(转到标号处执行指令)

这里short代表的是段内短转移,向前可转移128个字节,向后可转移127个字节。

标号代表目的地址。

指令结束后,cs:ip指向标号处的指令

这里需要说明一点:

有如下代码段:

代码段1:

assume cs:codesg
codesg segment

         start:mov ax,0
               jmp short s
               add ax,1
              s:inc ax

codesg ends
end start

代码段2:

assume cs:codesg
codesg segment

         start:mov ax,0
               mov bx,0
               jmp short s
               add ax,1
              s:inc ax

codesg ends
end start

代码段1和代码段2翻译成机器码:两个代码段的中jmp short s指令的机器指令分别为:

机器码             汇编指令

代码段1:  
EB03               JMP 0008

代码段2:   EB03               JMP 000B

可以看出汇编指令的0008和000B分别为两个代码段中s标号的偏移地址,然而两个代码段中jmp short s对应的机器码都是一样的,均为EB03.说明机器码中并不包含跳转的目的地址。

其实错了其中 EB03中的03即为将要跳转的标号处的地址为当前IP值加3.

所以 jmp short 标号   的跳转是根据当前IP值与标号处指令地址的偏移值进行跳转的

9.4转移的目的地址在指令中的jmp指令

jmp far ptr 标号  实现段间转移

功能为:CS=标号处的段地址  IP=标号处的偏移地址

far ptr 标号指明了使用标号处的段地址和偏移地址修改CS和IP

下面的代码:

assume cs:codesg
codesg segment
start: mov ax,0
       mov bx,0

       jmp far ptr s
       db 256 dup (0)
     s:add ax,1
       inc ax

codesg ends
end start

翻译成机器码:

jmp far ptr s的汇编为jmp 14FF:010B 机器码为EA0B01FF14 可以看出汇编指令和机器码中均包含了段地址14FF和偏移地址010B

9.5转移地址在寄存器中的jmp指令

比如jmp ax  这很容易理解,即将IP的值改为AX寄存器中存储的值进而实现跳转

9.6转移地址在内存中的jmp指令

jmp word ptr 内存地址(段内转移)

比如:

mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]

其含义为 IP=0123H

再比如:

mov ax,0123h
mov [bx],ax    含义:((ds)*16+(bx))=(ax)
jmp word ptr [bx]

此时IP=0123h

jmp dword ptr 内存地址(段间转移) 高地址的字存放段地址,低地址的字存放偏移地址

(CS)=(内存地址+2)

(IP)=(内存地址)

比如:

mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]

此时(CS)=0000H,(IP)=0123H

又比如:

mov ax,0123h
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]

此时(CS)=0000H,(IP)=0123H

9.7  jcxz指令

jcxz指令为有条件转移指令,所有有条件转移指令都为段内段转移指令

指令格式:

jcxz 标号(如果(cx)=0,则转移到标号处执行)

可以这样理解:

if((cx)==0)  jmp short s

9.8  loop指令

loop为循环指令,所有的循环指令均为段内短转移指令

指令格式 loop s(如果(cx)!=0,转移到标号处执行)

可以这样理解:

(cx)--

if((cx)!=0) jmp short s

9.9根据位移进行转移的意义以及编译器对转移位移超界的检测

jmp short s

jmp near ptr s

jcxz s

loop s

均为根据当前指令相对于标号处的位移进行更改IP的转移指令,这些指令的机器码中并不包括跳转目的地址,仅仅包含位移量。

当时针对短转移跳转指令,如果跳转位置超过正的127或者负的128都会出现移位超界,此时编译器会报错,务必注意这一点。

时间: 2024-08-28 00:07:49

汇编语言学习第九章-转移指令的原理的相关文章

王爽《汇编语言》第三版 第九章 转移指令的原理

引言 8086CPU的转移指令分为以下几类: 无条件转移指令 (如:jmp) 条件转移指令 循环指令(如:loop) 过程 中断 9.1 操作符offset 操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址. 9.2 jmp指令 jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP. 9.3 依据位移进行转移的jmp指令 jmp short 标号(转到标号处执行指令)这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是

汇编语言:第九章 转移指令的原理

可以修改IP或者CS:IP的指令叫做转移指令. 只修改IP,称为段内转移如jmp ax,根据对IP修改的范围不同分为短转移和近转移,范围分别为-128到127和-32768到32767 同时修改CS和IP的指令称为段间转移,如jmp 1000:0 9.1 offset offset 标号,用于取标号的偏移地址,如mov ax,offset start 相当于mov ax,0   start为代码段的标号 9.2 jmp指令 jmp是无条件转移指令,可以修改IP或者CS:IP都修改 jmp指令给出

第九章 转移指令的原理

引言 8086CPU的转移指令分为以下几类: 无条件转移指令(如:jmp) 条件转移指令 循环指令(如:loop) 过程(函数的调用过程) 中断 9.1 操作符 offset 9.2 jmp 指令 9.3 依据位移进行转移的 jmp 指令 9.4 转移的目的地址在指令中的 jmp 指令 9.5 转移地址在寄存器中的 jmp 指令 9.6 转移地址在内存中的 jmp 指令 9.7 jcxz 指令 9.8 loop 指令 9.9 根据位移进行转移的意义 9.10 编译器对转移位移越界的检测 原文地址

汇编语言(王爽) 第9章转移指令的原理

啥叫转移指令 修改IP或同时修改CS和IP的指令 只修改IP叫段内转移 同时修改CS和IP叫段间转移 段内转移又分为短转移和近转移 短转移 IP修改范围-128-127 近转移IP修改范围-32768-32767 基本的就上面的 9.1 offset 操作符 s1:mov bx,offset s1 s:mov ax,offset s offset X就是取得X的偏移地址 first 就是mov bx,ds:ds:[0] second  is mov ax,ds:[3] first instruc

《汇编语言》总结06 —— 转移指令的原理

(一)前述 可以修改IP,或同时修改CS和IP的指令统称为转移指令. 转移行为有以下几类: 只修改IP时,称为段内转移,比如:jmp ax. 同时修改CS和IP时,称为段间转移,比如:jmp 1000:0. 由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移. 短转移IP的修改范围为-128~127. 近转移IP的修改范围为-32768~32767. 8086CPU的转移指令分为以下几类: 无条件转移指令(如:jmp) 条件转移指令 循环指令(如:loop) 过程 中断 虽然这些转

Python爬虫学习==&gt;第九章:正则表达式基础

学习目的: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特点字符.及这些特点字符组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正式步骤 Step1:常用匹配模式 Step2:最常规的匹配 import re testString = 'I have 4Learned the python years' print(len(testString)) result = re.match('^I\s\w{4}\s\d\w{7}.*years$',t

java并发学习-第九章 指令重排序

一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作之间的执行顺序.提供跨线程的内存可见性. 在java内存模型中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必然存在happens-before关系 2.happens-before规则 a.程序顺序规则 单线程中的每个操作,总是前一个操作happens-before于该线程中的任

第九章 Servllet工作原理解析

9.1 从Servlet容器说起    Servlet容器:Jetty, Tomcat等. 这里以Tomcat为例,  真正管理Servlet的容器是Context容器,一个Context对应一个WEB工程, 9..1.1 Servlet容器的启动过程 9.1.2 Web应用的初始化工作 9.2 创建Servlet实例 9..2.1 创建Servlet实例 9.2.2 初始化Servlet 9.3 Servlet体系结构 9.4 Servlet如何工作 9.5 Servlet中的Listener

APUE学习笔记:第九章 进程关系

9.1 引言 本章将更详尽地说明进程组以及POSIX.1引入的会话的概念.还将介绍登陆shell(登录时所调用的)和所有从登陆shell启动的进程之间的关系. 9.1 终端登陆 系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名传递给getty程序的参数.当系统自举时,内核创建进程ID为1的进程,依旧是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,所生成的子进程则