2013-04-16 50 views
3

在x86汇编语言中,是否可以指定跳转到特定行号?在这里,我试图使用jmp指令到第3行。(我还不知道如何将标签作为参数传递给函数,所以我试图使用行号而不是在这种情况下的标记。)跳转到x86汇编语言的特定行

.686p 
.model flat,stdcall 
.stack 2048 
.data 

ExitProcess proto, exitcode:dword 
.code 

start: 

jmp 3; this produces the error shown below 

mov ax, 0 
mov bx, 0 
mov ah, 1 

invoke ExitProcess, 0 
end start 

上面的代码产生错误1>p4.asm(11): error A2076: jump destination must specify a label

+0

您的程序似乎没有第3行。 –

+0

如果计算空白,它会。 –

+0

但跳到空白是没有意义的,对吧?你究竟想要做什么? –

回答

4

您可以在该行放置一个标签。根据您的汇编语言方言,您可能会使用数字本地标签,或者您可能需要使用符号标签。一个可能的例子如下。我只有NASM这里测试,所以我真的不知道这个例子很好地映射到MASM,但你应该得到的想法:

start: 
    jmp .line3 
    mov ax, 0 
.line3: 
    mov bx, 0 
    mov ah, 1 

NASM使用导致.确定当地的标签。

+0

这可能会奏效。但是,我仍然不知道有什么方法将标签作为参数传递给x86程序集中的函数(这就是为什么我要使用数字而不是标签)。 –

+0

@AndersonGreen,在大多数情况下,标签几乎可以用作指针。 –

+0

在这种情况下,标签如何作为参数传递给函数? –

0

试试这个:

s1: add ax,1 
     jmp $-3 

这可以使你的程序跳转到S1。要小心,这个数字是偏移量的代码,行不数(指令“添加斧头,1”是3个字节) ,如果你想使一个间接跳转,试试这个:

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

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

+0

在16位代码中,add ax,1是3个字节'83 c0 01',但在32位代码中它是4个字节'66 83 c0 01'。在32位代码中,'83 c0 01'反汇编为'add eax,1'。所以在这种情况下,在'66 83 c0 01'指令的中间跳转会产生一个有效的指令('db 0x66'是一个前缀),但会给出不同的指令。在极少数情况下,您确实想要跳转到指令内部的偏移量,最好自己对指令进行编码(db 0x66,0x83,0xc0,0x01),这样您就知道了使用的精确编码。 – nrz

+0

使用'位16'或'位32'是个好习惯,这可以避免0x66的问题。 – reavenisadesk