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. js 数组API之every、some用法

    every 判断数组中是否每个元素都满足条件 只有都满足条件才返回true: 只要有一个不满足就返回false: arr.every(function(value,index,array){retur ...

  2. Appium 命令行模式下遇到的问题总结及解决方案 npm ERR! tar.unpack unzip(或者untar) error

    安装了GUI Appium后,卸载删除问题后,使用命令行模式安装. 一. 遇到问题: nalideMacBook-Pro:~ nali$ npm install -g appium npm ERR! ...

  3. 【dfs】POJ2386湖计数

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34735   Accepted: 17246 D ...

  4. 数据结构-栈 C和C++的实现

    在数据结构中,栈是一种桶状结构,每次往桶里放数据,最后放的数据最先被拿出来,最先放进去的数据最后才能出来(FILO) C语言: 一.文件清单: MyStack.h: #ifndef _MYSTACK_ ...

  5. 初学HTML5,你要懂得哪些?

    很多人问过我这个问题,想要做HTML5页面你要懂得哪些知识?而问这个问题的人基本上都是刚听说过或刚接触HTML5,处在迷茫的阶段,他们往往会被一些网上炫酷页面所吸引,然后自己也想学习HTML5,能通过 ...

  6. junit测试模板 unit-test

    一个项目能否发布上线,重要的环节就是测试.经过集成测试.性能测试.压力测试等不断循环的测试过后依据测试报告来确定上线.这些由专业的测试人员来完成,因此会导致程序开发者对自身的单元测试的弱化.若在代码中 ...

  7. ------- 当前全球最新的 IPv4 地址池使用报告 -------

    -------------------------------------------------------------- 对于互联网行业相关的从业人员而言,时刻关注 IPv4 地址池的状态此类&q ...

  8. UESTC 1599 wtmsb【优先队列+排序】

    题目链接:UESTC 1599 wtmsb 题意:给你一组数,每一次取出两个最小的数,将这两个数的和放入这组数中,直到这组数只剩下一个,求最后剩下那个数的大小! 分析:比赛的时候首先我就看到这道题数据 ...

  9. BZOJ3997: [TJOI2015]组合数学(网络流)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 284[Submit][Status ...

  10. [国嵌笔记][011][Linux密码破解]

    破解步骤 1.在系统启动时进入grub选项菜单 2.在grub选项菜单中按e进入编辑模式 3.编辑kernel行,添加 /init 1 (表示进入单用户启动模式,在单用户启动模式中不会要求输入密码) ...