1- jmp为无条件转移指令,可以只修改IP, 也可以同时修改CS和IP

jmp指令要给出两种信息:

(1) 转移的目的地址

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

2- 依据位移进行转移的jmp指令

jmp short 标号(转到表号处执行指令) ;段内短转移 -128-127

 assume cs:codesg
codesg segment
start: mov ax,
jmp short s
add ax,
s:inc ax
codesg ends
end start

执行后 ax 0001H

2- 根据位移进行转移的原理

 assume cs:codesg
codesg segment
start: mov ax,
jmp short s
add ax,
s:inc ax
codesg ends
end start

图1

 assume cs:codesg
codesg segment
start: mov ax,
jmp short s
add ax,
add ax,
s:inc ax
codesg ends
end start

图2

图1jmp 需要转移到 cs:0008 ,图2jmp需要转移到 cs:000B 两图的jmp 行代码的机器指令为 EB03 和 EB06 , 可见CPU在指令jmp命令的时候并不需要转移的目的地址.主要控制转移到哪里的是机器指令中得 EB,EB06. 03 和 06

首先回忆下CPU执行指令的过程:

(1) 从cs:ip指向的内存单元读取指令,读取的指令进入指令缓冲区.

(2) (IP) = (IP) + 所读取指令的长度, 从而指向下一条指令

(3) 执行指令. 转到1, 重复这个过程

按照以上步骤,(图1)查看程序执行jmp short s指令的执行过程:

(1) CS:0B60 IP:0003 CS:IP指向EB03(jmp short s 的机器码)

(2) 读取指令码EB03进入指令缓冲区

(3) (IP)=(IP)+所读取的指令长度=(IP)+2 = 0005, CS:IP指向 add ax,1

(4) CPU执行指令缓冲区的指令EB03

(5) 指令EB03执行后(IP)=0008H CS:IP指向 inc ax  IP由原来的 0005 + 03(及EB03中得03) = 0008

实际上指令jmp short "标号" 段内短转移 的功能为: (IP) = (IP) + 8位位移

(1) 8位位移 = "标号"处的地址 - jmp指令后的第一个字节的地址

(2) short指明此处位移为8位位移

(3) 8位位移的范围-128-127,用补码表示

(4) 8位位移由编译程序在编译时算出

jmp near ptr 标号 实现段内近转移 功能为 (IP) = (IP) + 16位位移

(1) 16位位移 = "标号"处的地址 - jmp指令后的第一个字节的地址

(2) near prt 指明此处位移为16位位移,进行的是段内近转移

(3) 16位位移的范围-32768-32767,用补码表示

(4) 16位位移由编译程序在编译时算出

3- 转移的目的地址在指令中的jmp指令 

  jmp far ptr 标号 实现的是,段间转移,又称为远转移.指明了指令用标号的段地址和偏移地址.

 assume cs:codesg
codesg segment
start: mov ax,
mov bx,
jmp far ptr s
db dup ()
s: add ax,
inc ax mov ax,4c00H
int 21h
codesg ends
end start

  CS:0B60 IP:010A 机器指令:EA0A01600B

4- 转移的目的地址在寄存器中的jmp指令 

  jmp 16位寄存器

  (IP) = (16位寄存器)

5- 转移的目的地址在内存中的jmp指令 

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

  功能:从内存单元地址开始存放着一个字,是转移的目的偏移地址

  mov ax,0123H

  mov ds:[0],ax

  jmp word ptr ds:[0]

  执行后(IP) = 0123H

  mov ax,0123H

  mov [bx],ax

  jmp word ptr [bx]

  执行后(IP) = 0123H  

  (2) 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)=0 (IP)=0123H CS:IP指向0000:0123

  

  mov ax,0123H

  mov [bx],ax

  mov word ptr [bx+2],0

  jmp dword ptr [bx]

  执行后:(CS)=0 (IP)=0123H CS:IP指向0000:0123

 assume cs:codesg
codesg segment
start: mov ax,2000H
mov ds,ax
mov bx,1000h
mov word ptr [bx].,0BEH
mov word ptr [bx].,6H
mov word ptr [bx]., mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]
codesg ends
end start

执行后:(CS)=0006 (IP)=00BEH CS:IP指向0006:00BE

[汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令的更多相关文章

  1. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?

     C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗?   关于占用内存的大小,enum类型本身是不占内存的,编译器直接 ...

  2. vs中调试程序查看变量在内存中的内容的方法

    vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...

  3. Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...

  4. [汇编语言]-第九章 jcxz,loop指令,转移位移的意义

    1- jcxz指令 指令为有条件转移指令, 所有的有条件转移指令都是短转移, 在对应的机器码中包含转移的位移, 而不是目的地址, 对IP的修改范围为: -128 ~ 127 指令格式: jcxz 标号 ...

  5. C/C++中整数与浮点数在内存中的表示方式

    在C/C++中数字类型主要有整数与浮点数两种类型,在32位机器中整型占4字节,浮点数分为float,double两种类型,其中float占4字节,而double占8字节.下面来说明它们在内存中的具体表 ...

  6. java中的各种数据类型在内存中存储的方式

    原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...

  7. [汇编语言]-第九章 在屏幕中间分别显示绿底红色,白底蓝色字符串"welcome to masm!"

    ;在屏幕中间分别显示绿色,绿底红色,白底蓝色字符串"welcome to masm!" assume cs:codesg,ds:datasg,ss:stacksg datasg s ...

  8. JVM中java实例对象在内存中的布局

    普通的Java对象实例 和  Java数组实例.Java数组实例的对象头多了一个数组的长度.Java虚拟机可以通过普通java对象的元数据来确定java对象的大小,但是从数组的元数据中却无法确定数组的 ...

  9. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

随机推荐

  1. [ofbiz]解决load-demo花费过长时间的问题

    一直以来使用公司配置的hp-cq45笔记本,在初始化ofbiz的时候load-demo需要花费很长一段时间,比如90分钟,或者129分钟. 解决办法:安装官方驱动--intel快速存储驱动 ok,lo ...

  2. js 函数声明与函数表达式

      1,变量包括全局变量和局部变量,局部变量只能在函数内部访问.如果函数传参和全局变量一样的话,即使是给全局变量赋值,这里会把全局变量当成局部变量的. 如: 1: var x='x'; 2:   3: ...

  3. [Zookeeper研究]一 Zookeeper技术简介

    最近的项目中使用到了Zookeeper.Kafka以及Storm.仔细研究了一下,觉得这几个开源项目对于搞分布式的人来说是非常有用的,所以想把自己的一点心得体会总结一下,希望能对大家有所帮助. 首先从 ...

  4. 关于Keil C51中using关键字的使用心得

    刚才看到一位很牛的师兄写的一篇日志中提到了Keil C51中using这个关键字的用法,粗心的我本来一直都没有留意它是用来干嘛的(因为我一般看见它都是在中断服务函数的定义开头处,好像没有了它也可以中断 ...

  5. SQL Server 视图

    视图实际上就是一个存储查询,重点是是可以混合和匹配来自基本表(或者其他视图)的数据,从而创建在很多方面像另一个基表那样起作用的对象.可以创建一个简单的查询,仅仅从一个表中选择几列,而忽略其他列:或者也 ...

  6. 转:LINQ查询返回DataTable类型

    动态绑定ReportViewer虽然之前实现过,但现在弄起来还是有点晕,主要是过去没有使用Linq,数据的操作经常用到DataTable,可以直接拿来使用,现在用Linq更方便,也懒得再用之前的数据库 ...

  7. HDOJ2553-N皇后问题(DFS)

      N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. Canvas API -- JavaScript 标准参考教程(alpha)

    Canvas API -- JavaScript 标准参考教程(alpha) Canvas API

  9. IP、路由配置

    IP地址组成: 网络地址主机地址32位二进制 A类: 255.0.0.0, 8:    0 000 0001 - 0 111 1111     127个A类,127用于回环,1-126    2^7- ...

  10. zoj 3471 Most Powerful(状态压缩dp)

    Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These ato ...