Assembly 如何使NASM默认生成跳远?

Assembly 如何使NASM默认生成跳远?,assembly,nasm,x86-16,Assembly,Nasm,X86 16,我有一个16位DOS COM文件的反汇编,我想把它汇编成一个尽可能接近的二进制文件 我使用的是NASM,但尽管手册上说跳转在默认情况下编码为短跳转,但在使用数字地址时,跳转实际上编码为近跳转 程序(以下章节中的文件内容): 跳转\u未指定。asm: bits 16 org 04FEh main: JNZ 0x0529 TEST BYTE [SI+0x0431], 0x02 JNZ 0x050A bits 16 org 04FEh main: JNZ SHO

我有一个16位DOS COM文件的反汇编,我想把它汇编成一个尽可能接近的二进制文件

我使用的是NASM,但尽管手册上说跳转在默认情况下编码为短跳转,但在使用数字地址时,跳转实际上编码为近跳转

程序(以下章节中的文件内容):

跳转\u未指定。asm

bits 16
org 04FEh
main:
    JNZ  0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  0x050A
bits 16
org 04FEh
main:
    JNZ  SHORT 0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  SHORT 0x050A
000004FE  0F852700          jnz word 0x529
00000502  F684310402        test byte [si+0x431],0x2
00000507  0F85FFFF          jnz word 0x50a
000004FE  7529              jnz 0x529
00000500  F684310402        test byte [si+0x431],0x2
00000505  7503              jnz 0x50a
跳转\u short.asm

bits 16
org 04FEh
main:
    JNZ  0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  0x050A
bits 16
org 04FEh
main:
    JNZ  SHORT 0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  SHORT 0x050A
000004FE  0F852700          jnz word 0x529
00000502  F684310402        test byte [si+0x431],0x2
00000507  0F85FFFF          jnz word 0x50a
000004FE  7529              jnz 0x529
00000500  F684310402        test byte [si+0x431],0x2
00000505  7503              jnz 0x50a
跳转\u未指定的dis.asm

bits 16
org 04FEh
main:
    JNZ  0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  0x050A
bits 16
org 04FEh
main:
    JNZ  SHORT 0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  SHORT 0x050A
000004FE  0F852700          jnz word 0x529
00000502  F684310402        test byte [si+0x431],0x2
00000507  0F85FFFF          jnz word 0x50a
000004FE  7529              jnz 0x529
00000500  F684310402        test byte [si+0x431],0x2
00000505  7503              jnz 0x50a
跳转\u short.dis.asm

bits 16
org 04FEh
main:
    JNZ  0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  0x050A
bits 16
org 04FEh
main:
    JNZ  SHORT 0x0529
    TEST BYTE [SI+0x0431], 0x02
    JNZ  SHORT 0x050A
000004FE  0F852700          jnz word 0x529
00000502  F684310402        test byte [si+0x431],0x2
00000507  0F85FFFF          jnz word 0x50a
000004FE  7529              jnz 0x529
00000500  F684310402        test byte [si+0x431],0x2
00000505  7503              jnz 0x50a

NASM可能正在组装16位相对近跳转,因为目标超出了8位相对短跳转的范围。如果这是您正在汇编的实际完整代码,那么
.04FE JNZ 0x0529
指令将位于地址0处,因此距离分支目标0x0529字节。您确实意识到
.04FE
只是一个标签,不会让nasm将代码放置在正确的位置?您的解释不正确。它们绝对是以短跑的形式组装起来的。请注意,
jnz0x0529
仅占用2个字节。这将是后跟+-短偏移量的短跳转指令。近跳转将被编码为包含较长的近目的地。您的反汇编只是向您显示跳转继续的偏移量。尝试使用objdump并读取十六进制输出来向自己证明这一点。谢谢!我知道标签不会影响地址;它们的出现只是因为代码来自修改过的DOS调试转储。我已经把它们去掉了,因为它们显然让人困惑。大家好!我提供了可处理的示例,以及结果。