Assembly 如何使用相对跳跃?

Assembly 如何使用相对跳跃?,assembly,nasm,x86,Assembly,Nasm,X86,关于相对跳跃,我有以下问题: 我知道相对于当前PC,JMP SHORT将跳转到字节。是否正确 汇编程序会自动生成一个相对跳转的操作码,这是真的吗?i、 e.当我刚刚编写JMP时,如果该标签位于当前PC的128字节范围内,它将生成一个相对跳转 如果我确实想使用JMP SHORT,那么计算位移的正确方法是什么?通过检查列表文件并计算偏移量 每个汇编器(程序)和汇编器的每个版本都可以选择默认为long或short。所以我不会寻找一个所有汇编程序都默认为一件事的总括语句。如果好奇,试试看会发生什么 对于

关于相对跳跃,我有以下问题:

  • 我知道相对于当前PC,
    JMP SHORT
    将跳转到
    字节。是否正确
  • 汇编程序会自动生成一个相对跳转的操作码,这是真的吗?i、 e.当我刚刚编写
    JMP
    时,如果该标签位于当前PC的128字节范围内,它将生成一个相对跳转
  • 如果我确实想使用
    JMP SHORT
    ,那么计算位移的正确方法是什么?通过检查列表文件并计算偏移量
  • 每个汇编器(程序)和汇编器的每个版本都可以选择默认为long或short。所以我不会寻找一个所有汇编程序都默认为一件事的总括语句。如果好奇,试试看会发生什么

    对于x86和可变长度指令,很难简单地编码位移,必须提醒自己永远不要接触跳转和目标之间的代码


    是的,我首先让汇编程序使用标签对指令进行编码,然后获取指令集参考手册和带地址的反汇编,并找出如何计算位移。如果汇编器允许您自己设置置换,这很可能是汇编器特有的事情,您需要知道它可能需要什么单位来进行置换。x86可能是字节,但固定字长指令集可能必须以指令而不是字节为单位进行显示。或者字节不是指令,因此我将使用置换,然后再次反汇编,以查看它是否计算了正确的指令。

    假设汇编程序自动使用短编码或正常编码。乍一看,如果可能的话,总是切换到短编码似乎是可以的,但实际上,这样做是有可能的,因此其他分支必须再次更改为长编码

    例如(未经测试或任何事情,只是为了获得想法):

    所以你不能通过“向前”传球来确定尺寸——当你在跳远时,你还不知道它是否适合,因为你还没有决定如何处理其他跳远

    那倒回去?(未经测试或其他任何事情,只是为了获得想法)

    不,也不能向后传球,在决定跳转到_quiteFarAway的编码时,你还不知道它是否适合,因为你还没有决定如何处理其他跳转

    完成你的第二点很难,有很多不同的方法来解决这个问题。例如,使用一个显式的“短”修饰符,一个显式的“长”修饰符,做出一个安全的猜测,最后得到一个长版本,在极少数情况下不需要这样做,等等

      jmp _skip          ; relative offset depends on
                   the size of "other code", which may include other jumps
      ; other code
    _skip:
    
      .fill 124
      jmp _somewhere     ; 2 bytes, or 5?
      jmp _quiteFarAway  ; relative offset is either 130 or 127
      .align 256
    _quiteFarAway: