Assembly 如何使用相对跳跃?
关于相对跳跃,我有以下问题:Assembly 如何使用相对跳跃?,assembly,nasm,x86,Assembly,Nasm,X86,关于相对跳跃,我有以下问题: 我知道相对于当前PC,JMP SHORT将跳转到字节。是否正确 汇编程序会自动生成一个相对跳转的操作码,这是真的吗?i、 e.当我刚刚编写JMP时,如果该标签位于当前PC的128字节范围内,它将生成一个相对跳转 如果我确实想使用JMP SHORT,那么计算位移的正确方法是什么?通过检查列表文件并计算偏移量 每个汇编器(程序)和汇编器的每个版本都可以选择默认为long或short。所以我不会寻找一个所有汇编程序都默认为一件事的总括语句。如果好奇,试试看会发生什么 对于
JMP SHORT
将跳转到
字节。是否正确JMP
时,如果该标签位于当前PC的128字节范围内,它将生成一个相对跳转JMP SHORT
,那么计算位移的正确方法是什么?通过检查列表文件并计算偏移量是的,我首先让汇编程序使用标签对指令进行编码,然后获取指令集参考手册和带地址的反汇编,并找出如何计算位移。如果汇编器允许您自己设置置换,这很可能是汇编器特有的事情,您需要知道它可能需要什么单位来进行置换。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: