【问题标题】:Jump to specific line in x86 assembly language跳转到 x86 汇编语言中的特定行
【发布时间】:2013-04-16 04:26:12
【问题描述】:

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

.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。

【问题讨论】:

  • 您的程序似乎没有第 3 行。
  • 如果计算了空格,它会。
  • 但是跳转到空白是没有意义的,对吧?你到底想做什么?
  • @CarlNorum 好的,我已经修好了——程序现在有第 3 行了。
  • 所以第 3 行是 mov bx, 0?

标签: assembly x86 masm


【解决方案1】:

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

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

NASM 使用前导 . 来识别本地标签。

【讨论】:

  • 这可能行得通。但是,我仍然不知道有什么方法可以将标签作为参数传递给 x86 程序集中的函数(这就是我尝试使用数字而不是标签的原因)。
  • @AndersonGreen,在大多数情况下,标签几乎可以用作指针。
  • 在那种情况下,标签如何作为参数传递给函数?
  • 这取决于调用约定,但对于 ia32,将适当的地址推送到堆栈上的正确位置即可。对于 x86_64,您需要将其放入适当的寄存器中。类似lea rcx, label。
【解决方案2】:

试试这个:

s1:   add ax,1
      jmp $-3

这可以让你的程序跳转到s1。注意,数字是代码的偏移量,而不是行数。(指令'add ax,1'是3个字节) 如果你想进行间接跳转,试试这个:

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

更多信息,google间接跳转。

【讨论】:

  • 在 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),这样您就知道使用的精确编码。
  • 使用bits 16或bits 32是个好习惯,这样可以避免0x66问题。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多