Assembly 跳转到x86汇编语言中的特定行

Assembly 跳转到x86汇编语言中的特定行,assembly,x86,masm,Assembly,X86,Masm,在x86汇编语言中,是否可以指定跳转到特定的行号?在这里,我尝试使用jmp指令处理第3行。(我还不知道如何将标签作为参数传递给函数,因此在本例中,我尝试使用行号而不是标签。) 上面的代码生成错误1>p4。asm(11):错误A2076:跳转目标必须指定一个标签您可以在该行放置一个标签。根据您的汇编语言方言,您可能可以使用数字本地标签,或者可能需要使用符号标签。下面是一个可能的例子。我这里只有NASM要测试,所以我不确定这个示例是否能很好地映射到MASM,但您应该明白: start: jm

在x86汇编语言中,是否可以指定跳转到特定的行号?在这里,我尝试使用
jmp
指令处理第3行。(我还不知道如何将标签作为参数传递给函数,因此在本例中,我尝试使用行号而不是标签。)


上面的代码生成错误
1>p4。asm(11):错误A2076:跳转目标必须指定一个标签

您可以在该行放置一个标签。根据您的汇编语言方言,您可能可以使用数字本地标签,或者可能需要使用符号标签。下面是一个可能的例子。我这里只有NASM要测试,所以我不确定这个示例是否能很好地映射到MASM,但您应该明白:

start:
    jmp .line3
    mov ax, 0
.line3:
    mov bx, 0
    mov ah, 1
NASM使用前导的
标识本地标签。

尝试以下操作:

s1:   add ax,1
      jmp $-3
这可以使您的程序跳转到s1。注意,数字是代码的偏移量,而不是行数。(指令“add ax,1”是3字节) 如果要进行间接跳转,请尝试以下操作:

jmp far [address]
address dw 0123h ;the ip
        dw 5678h ;the cs

更多信息,谷歌间接跳转。

这可能有用。但是,我仍然不知道如何将标签作为参数传递给x86汇编中的函数(这就是为什么我尝试使用数字而不是标签)。@AndersonGreen,标签在大多数情况下几乎可用作指针。在这种情况下,标签如何作为参数传递给函数?这取决于调用约定,但对于ia32,将适当的地址推到堆栈上的正确位置即可。对于x86_64,您需要将其放入适当的寄存器中。类似于
learcx,label
。您的程序似乎没有第3行。如果计算了空格,就会有第3行。但是跳转到空格是没有意义的,对吗?你到底想做什么?@CarlNorum好的,我已经修好了-程序现在有了第3行。所以第3行是
mov bx,0
?在16位代码
add ax中,1
是3字节
83 c0 01
,但在32位代码中是4字节
66 83 c0 01
。在32位代码中,
83 C001
反汇编为
添加eax,1
。因此,在这种情况下,在<代码> 66中跳出83 C0 01</Cult>指令产生一个有效的指令(<代码> db 0x66 < /COD>是前缀),但给出了不同的指令。在极少数情况下,您确实希望跳转到指令内部的偏移量,最好自己对指令进行编码(
db 0x66,0x83,0xc0,0x01
),这样您就知道所使用的精确编码。最好使用
位16
位32
,这样可以避免0x66问题。
jmp far [address]
address dw 0123h ;the ip
        dw 5678h ;the cs