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. MssqlOnLinux 备份和日志【3】

    数据库恢复模式: 一 简单模式:只对数据进行备份,不备份日志. 二 完整模式:支持数据,日志备份. 三 大容量日志模式:支持数据,日志备份.适用于大规模大容量操作,用最小的方式记录大多数操作. 数据库 ...

  2. 【转】 Git——如何将本地项目提交至远程仓库

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  3. asp.net mvc 5 蛋疼的问题

    看图,debugger显示匹配路径没有错.    html开源码看 显示没有实现IController. 然而我的确实现了.  关闭vs 重启

  4. Java集合系列[2]----LinkedList源码分析

    上篇我们分析了ArrayList的底层实现,知道了ArrayList底层是基于数组实现的,因此具有查找修改快而插入删除慢的特点.本篇介绍的LinkedList是List接口的另一种实现,它的底层是基于 ...

  5. 发布到ASP.NET CORE项目到 Windows server 2012

    原文: https://github.com/zeusro/MarkdownBlog/blob/master/2018/2018-01-17-01.md 发布到ASP.NET CORE项目到 Wind ...

  6. 【Java】静态代码块使用

    一.java静态代码块与静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调 ...

  7. 【Spring】DispatcherServlet源码分析

    使用过HttpServlet的都应该用过其doGet和doPost方法,接下来看看DispatcherServlet对这两个方法的实现(源码在DispatcherServlet的父类Framework ...

  8. 关于python使用cv画矩形并填充颜色同时填充文字

    font = cv2.FONT_HERSHEY_SIMPLEX # 使用默认字体 cv2.rectangle(im, (10, 10), (110, 110), (0, 0, 255), thickn ...

  9. MATLAB学习笔记

    魔方矩阵(magic(阶数)) 魔方矩阵又称幻方,是有相同的行数和列数,并在每行每列.对角线上的和都相等的矩阵.魔方矩阵中的每个元素不能相同.你能构造任何大小(除了2x2)的魔方矩阵. 希尔伯特矩阵( ...

  10. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5577  Solved: 3031[Submit][Statu ...