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. SpringMVC 如何在页面中获取到ModelAndView绑定的值

    springMVC中通过ModelAndView进行后台与页面的数据交互,那么如何在页面中获取ModelAndView绑定的值呢? 1.在JSP中通过EL表达式进行获取(比较常用) 后台:ModelA ...

  2. HTML5本地存储应用sessionStorage和localStorage

    在html5之前,浏览器要实现数据的存储,一般都是用cookie,但是cookie有域名和大小限定. html5流行之后,可以通过localStorage和sessionStorage实现浏览器端的数 ...

  3. jsp数据

    ---恢复内容开始--- JSP 是什么 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结 ...

  4. (7拾遗)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  5. 85、flask之wtforms

    本篇导航: wtforms组件的使用 自定义From组件 一.wtforms组件的使用 1.flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进 ...

  6. python的运维交流学习笔记

    #!/usr/bin/env | #!/usr/bin/python#coding:gbk #python 运维练习 #需求: #1.利用python实现自动监控服务器性能 #2.并将监控到的数据进行 ...

  7. Python源码剖析之准备工作

    一个Python程序开发者, 也是C语言爱好者, 为了加强自己对Python语言实现的理解, 最近选择阅读下陈儒老师的书, 对Python3.5.1源码进行阅读, 再次记录下读书笔记.  一.Pyth ...

  8. 关于ODP.NET连接数监控及相应的windbg分析提示

    1.关于ODP.NET的Windows计数器问题 使用微软的缺省驱动时,可以通过windows性能监视器很方便的监控数据库连接数,选择.NET Data Provider for Oracle/Sql ...

  9. laravel 生成 key

    把 .env.example 文件 复制并重命名为 .env 文件 命令行运行 php artisan key:generate php artisan key:generate

  10. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...