body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}

1、向前转移
s:  :
    :
    :
jmp  s ( jmp  short  s、jmp  near  ptr  s、jmp  far  ptr  s )
    编译器中有一个地址计数器(AC ) ,编译器在编译程序过程中,每读到一个字节AC就加一。当编译器遇到一些伪操作的时候,也会根据具体情况使AC增加,如db、dw 等。
在向前转移时,编译器可以在读到标号s 后记下AC 的值as ,在读到jmp … s 后记下AC的值aj 。编译器可以用as – aj 算出位移量disp 。
此时,编译器作如下处理:
(1)如果disp ∈[128,127 ],则不管汇编指令格式是:
jmp  s
jmp  short  s
jmp  near  ptr  s
jmp  far  ptr  s
中的哪一种,都将它转变为jmp  short  s 所对应的机器码。
jmp  sbort  s 所对应的机器码格式为:EB disp(占两个字节)
编译,连接以下程序,用Debug 进行反汇编查看。

assume  cs : code
code  segment
s:  jmp  s
    jmp  short  s
    jmp  near  ptr  s
    jmp  far  ptr  s
code  ends
end  s
(2)如果disp∈[32765,32767],则:
对于jmp  short  s 将产生编译错误;
对于jmp  s、jmp  near  ptr  s 将产生 jmp  near  ptr  s 所对应的机器码;
jmp  near  ptr  s 所对应的机器码格式为;E9 disp (占3 个字节)
对于jmp  far  ptr  s 将产生相应的编码;
jmp  far  ptr  s 所对应的机器码格式为:EA 偏移地址 : 段地址(占5 个字节)
编译,连接以一下程序:

assume  cs : code
code  segment
s:  db 100 dup (0b8h , 0 , 0 )      ; db 100 dup (0 , 0 , 0 )
    ;jmp  short  s       ; 超过short能表示的8位范围
start:
    jmp  s
    jmp  near  ptr  s
    jmp  far  ptr  s
code  ends
end  s
编译中将产生错误,错误是由jmp  short  s 引起的,去掉jmp  short  s 后再编译就可通过。用Debug 进行反汇编查看。

//db 100 dup (0 , 0 , 0 ) 

//100 dup (0b8h , 0 , 0 )
// 拷贝的是指令代码

2、向后转移
jmp  s  (jmp  short  s、jmp  near  ptr  s、jmp  far  ptr  s)
          :
          :
s:        :
    在这种情况下,编译器先读到jmp … s 指令。由于它还没有读到标号 s ,所以此时还不能确定标号s 处的AC 值。也就是说,编译器不能确定位移量disp 的大小。此时,编译器将 jmp … s 指令都当作jmp  short  s 来读取,记下jmp … s 指令的位置和AC的值aj ,并作如下处理:
对于jmp  short  s ,编译器生成EB 和1 个nop 指令(相当于预留1 个字节的空间,存放8位disp );
对于jmp  s 和jmp  near  ptr  s ,编译器生成EB 和两个nop指令(相当于预留两个字节的空问,存放16 位disp ) ;
对十jmp  far  ptr  s ,编译器生成EB 和4 个nop 指令(相当于预留4 个字节的空间,存放段地址和偏移地址)。
    做完以上处理后,编译器继续工作,当向后读到标号s 时,记下AC 的值as ,并计算出转移的位移量:disp = as – aj 。
此时,编译器作如下处理:
(1)当disp ∈[ –128 ,127]时,不管指令格式是:
jmp  short  s
jmp  s
jmp  near  ptr  s
jmp  far  ptr  s
中的哪一种,都在前面记下的jmp … s 指令位置处添上jmp  short  s 对应的机器码(格式为:EB disp)。
注意:此时,对于jmp  s 和jmp  near  ptr  s 格式,在机器码EB disp后还有1 条nop 指令;对于jmp  far  ptr  s 格式,在机器码 EB disp 后还有3 条nop 指令。
编译,连接以下程序,用Debug 进行反汇编查看。


assume  cs : code
code  segment
begin:        
        jmp  short  s
        jmp  s
        jmp  near  ptr  s
        jmp  far  ptr  s
s:        
        mov  ax,0
code  ends
end  begin

(2)当disp ∈[ –32768 ,32767]时,则:
对于jmp  short  s ,将产生编译错误;
对于jmp  s 、jmp  near  ptr  s ,在前面记下的jmp … s 指令位置处添上 jmp near ptr s 所对应的机器码(格式为:E9 disp)。
对于 jmp far ptr s 在前面记下的jmp … s 指令位置处添上对应的代码。
编译,连接以下程序:

assume  cs : code
code  segment
begin:
        ;jmp  short  s       ; 超过short能表示的8位范围
        jmp  s
        jmp  near  ptr  s
        jmp  far  ptr  s
        db  100  dup  ( 0b8h , 0 , 0 )
s:  
        mov  ax,2
code  ends
end  begin

在编译中将产生错误,错误是由jmp  short  s 引起的,去掉jmp  short  s 后再编译就可通过。用Debug 进行反汇编查看。

汇编编译器(masm.exe)对jmp的相关处理的更多相关文章

  1. Debug和汇编编译器masm对指令的不同处理

    我们在Debug和源程序中写入同样形式的指令 : "mov al,[0]","mov bl,[1]","mov cl,[2]"," ...

  2. 工具分享1:文本编辑器EditPlus、汇编编译器masm、Dos盒子

    工具已打包好,需要即下载 链接 https://pan.baidu.com/s/1dvMyvW 密码 mic4

  3. 解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析

    许可证编译器 (Lc.exe) 的作用是读取包含授权信息的文本文件,并产生一个可作为资源嵌入到公用语言运行库可执行文件中的 .licenses 文件. 在使用第三方类库时,经常会看到它自带的演示程序中 ...

  4. REACTOS(193)与汇编编译器(69)的高人

    REACTOS(193)与汇编编译器(69)的高人http://blog.csdn.net/caimouse ReactOS编译成VS工程1: 首先从https://www.reactos.org/w ...

  5. 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

    ;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...

  6. Win10(64位)安装汇编环境(MASM)

    1:需要的文件 需要的安装包:这些百度都能下载找到 1).DOSBox 链接: 2) .MASM5.0 链接: 3).DEBUG 链接: 下面给出我们打包的环境 直接可用: (汇编我并不需要关注安装这 ...

  7. 预处理、编译、汇编、链接、启动代码、相关command

    被忽略的过程 对于C这种编译性语言,我们平时编译时,不管是通过IDE图形界面,还是通过命令行,总感觉编译一下就完成了,然后就得到了针对某OS和某CPU的二进制可执行文件(机器指令的文件).但是实际上在 ...

  8. 在64位windows 7上安装汇编调试工具debug.exe的方法

    最近我在研究汇编,书中介绍的调试工具还是基于WinXP 32bit时代中自带debug.exe进行调试,但是64bit的Windows XP.Vista.Win7.Win8都已经不自带这个工具了,网上 ...

  9. 深入探究VC —— 资源编译器rc.exe(3)

    Windows应用程序中,图标.菜单.畏途.图标.工具条.对话框等是以资源的形式存在的.开发人员也可以自定义资源类型.如果一个程序使用了资源,那么它在构建时需要对资源进行编译.程序所使用的资源会在资源 ...

随机推荐

  1. form注册表单圆角 demo

    form注册表单圆角 <BODY> <div class="form"> <ul class="list"> <li& ...

  2. C#winform自定义控件模拟设计时界面鼠标移动和调节大小、选中效果

    要想玩转Winform自定义控件需要对GDI+非常熟悉,对常用的控件有一些了解,好选择合适的基类控件来简化. 要点说明及代码 1)定义接口: using System; using System.Wi ...

  3. DNN论文分享 - Item2vec: Neural Item Embedding for Collaborative Filtering

    前置点评: 这篇文章比较朴素,创新性不高,基本是参照了google的word2vec方法,应用到推荐场景的i2i相似度计算中,但实际效果看还有有提升的.主要做法是把item视为word,用户的行为序列 ...

  4. 什么是TNB?如何买TNB?

    我天天在微博上看到有人吹TNB,今天一起来看下它到底是什么玩意? 什么是TNB? Time New Bank (TNB) 旨在打造精淮的时间价值传输网络.   我们高度认可人们时间付出的商业价值,每个 ...

  5. java String 不可变

    关于String不可变的问题也看了很多,最近看了一篇讲的非常好的文章,总结如下 所谓的不可变,并非真的不可变String s = "123"; s = "456" ...

  6. Linux简介与安装

    Linux系统的组成 Linux 内核:内核是系统的"心脏",是运行程序与管理像磁盘和打印机等硬件设备的核心程序. Linux Shell:Shell是系统的用户界面,提供了用户与 ...

  7. Linux 和Windows之间命令行实现目录或文件互传

    在linux中,我们常用scp命令传输文件: 如以下实例,我们想把当前服务器文件abc.sql传输到192.168.1.1服务器上 我们可以执行以下命令: scp /home/person/hww/a ...

  8. MySQL 5.7 InnoDB缓冲池NUMA功能支持——但是别高兴的太早

    当前CPU都已是NUMA架构,相信除了历史遗留系统,很少会有数据库跑在SMP的CPU上了.NUMA架构带来的优势无言而语,CPU更快的内存访问速度,但是带来的问题也不言而喻,特别是对于数据库的影响.M ...

  9. .NET技术面试题系列(1) 基础概念

    这是.NET技术面试题系列第一篇,今天主要分享基础概念. 1.简述 private. protected. public.internal 修饰符的访问权限 private : 私有成员, 在类的内部 ...

  10. 7、ABPZero系列教程之拼多多卖家工具 修改注册功能

    本篇开始进入重头戏,之前的几篇文章都是为了现在的功能作准备.前面教程已经讲到修改User表结构,接下来就需要修改注册逻辑代码. 注册页面 修改Register.cshtml,备注如下代码: 文件路径: ...