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

可以修改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指令给出以下两种信息之一:

(1)转移目的地址

(2)转移位移

9.3 根据位移进行转移

jmp short 标号  表示段内短转移,8个字节长度表示位移量,因此可以表示范围是:向前转移128字节到向后转移127字节

      即 IP=IP+8位位移,8位位移=标号偏移地址 - jmp的下一条指令的偏移地址

jmp near ptr 标号   表示段内近转移,IP=IP+16位位移

这两种转移 在编译器编译后给出目标地址,但是机器码会给出位移地址

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

jmp far ptr 标号,实现段间转移也叫远转移,将标号的段地址和偏移地址放入CS:IP中

这种转移 编译器编译后给出目标地址,机器码也指定转移的目标地址

9.5 转移地址在jmp中

jmp 16位reg

IP = 16位reg值

9.6 转移地址在内存中

jmp word ptr 内存单元地址: 将内存单元处字单元作为IP的值

jmp dword ptr 内存单元地址: 将内存单元处第一个字单元作为IP值,第二个字单元作为CS值

检测点9.1

(1) 程序如下:

assume cs:code

data segment

?

data ends

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

jmp word ptr [bx+1]

code ends

end start

要使jmp执行后CS:IP指向程度第一条指令,data中应该怎么填?

分析:  jmp word ptr [1] 就是把1地址字单元值放入IP,即让CS:IP指向CS:0,所以让1地址字单元值为0

     所以data里应该是db 0,0,0

(2)程序如下

assume cs:code

data segment

dd 12345678H

data ends

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

mov [bx],

mov [bx+2],

jmp dword ptr ds:[0]

code ends

end start

补全程序使jmp执行后CS:IP指向程序第一条指令

分析: jmp dword ptr ds:[0] 表示让0地址字单元放入IP2地址字单元放入CS中

所以让0地址字单元变成0,2地址字单元变成CS,

所以: mov [bx],bx   此处不可以用 mov [bx],0 因为需要确定指令数据长度

      mov [bx+2],cs

(3)用Debug 查看内存,结果如下:

2000:1000 BE 00 06 00 00 00 .....

则此时,CPU执行指令

mov ax,2000H

mov es,ax

jmp dword ptr es:[1000H]

后 CS = 0006H,  IP = 00BEH

9.7

时间: 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的值的指令称为转移指令.转移指令的功能就是使得CPU执行内存中某段特定的指令或程序. 8086CPU的转移行为分为如下几类: 1.只改变IP值,称为段内转移.比如 jmp ax;段内转移又分为短转移和近转移.短转移IP的修改范围为-128~127,近转移IP的修改范围为-32768~32767. 2.同时改变CS:IP的值称为段间转移.比如 jmp 1000:0 8086CPU的转移指

第九章 转移指令的原理

引言 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

第九章 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

《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

? 书中第九章的程序,主要讲了 ● 代码,Irvine32 中的字符串库函数代码范例 1 INCLUDE Irvine32.inc 2 3 .data 4 str1 BYTE "abcde////", 0 5 str2 BYTE "ABCDE", 0 6 msg0 BYTE "Upper case: ", 0 7 msg1 BYTE "str1 == str2", 0 8 msg2 BYTE "str1 < s

读书笔记第九章

第九章HAL是建立在linux驱动之上的一套程序库.这套程序库并不属于linux内核,而是属于linux内核层之上的应用层.可以用来保护不想公开源代码的作者.HAL架构比较简单,其基本原理就是在安卓系统中使用程序库调用位于内核空间的linux驱动,然后安卓应用程序可以通过NDK程序访问HAL中的程序库,或直接在安卓应用程序中访问HAL中的程序库.编写一款支持HAL的linux驱动程序的步骤:1.编写linux驱动,linux驱动的代码要尽量简介,尽可能将业务逻辑放到HAL library中.2.

第九章心得体会

通过第九章的学习,我学到了如下知识点: 第九章:硬件抽象层:HAL 9.1为什么要在Android中加入HAL 1.HAL并不是Linux内核的一部分,而是位于Android的系统运行库层 2.为Android加入HAL主要目的:统一硬件的调用借口,解决了GPL的版权问题,针对一些特殊的要求. 9.2Android HAL架构 9.3为LED驱动增加HAL 1.编写一款支持HAL的Linux驱动程序的步骤 第一步:编写Linux驱动 Linux驱动代码要尽量的简洁,尽可能将业务逻辑放到HAL L

第九章:IO流

第九章:IO流 File类 java.io.File类:表示文件或目录.常用方法:getName()getPath()getAbsolutePath()length()isFile()isDirectory()listFiles()mkdir()/mkdirs()createNewFile().... 流的原理和分类 按照方向分:输入流和输出流 按照读写单位:字节流和字符流 按照功能:节点流和处理列 字节输入流和字节输出流(节点流) 字节输入:InputStream InputStream抽象类