【问题标题】:Questions about indirect jmp in protected mode关于保护模式下间接jmp的问题
【发布时间】:2013-04-15 09:29:41
【问题描述】:

因为地址xxxx:yyyyyyyy在保护模式下是32位的,所以我在一块内存里放了一个48位的地址,想给间接jmp,下面是我写的:

mov eax,s1
mov [address],eax
mov ax,SelectorCode32
mov [address+4],ax
jmp  fword [address]

address:dd 0
        dw 0

但是 nasm 显示 jmp fword [address] 是错误的,我已经阅读了一些类似 this 的建议,但也没有帮助,我该怎么办?

【问题讨论】:

  • this,在我的情况下,一个方法选择了一个正确的tss来jmp,所以在运行之前地址是未知的,所以jmp xxxx:yyyyyyyy是没用的。
  • @AkiSuihkonen 你错了。您所说的是JMP ptr16:32 表单,但也有JMP m16:32。请参阅您的 Intel 或 AMD 手册。
  • Nasm 是一个不错的家庭汇编程序,并且不知道 fword。 :) 只是jmp far [address] 应该这样做。如果不是 32 位代码,可能是 jmp far dword [address]

标签: assembly x86 protected-mode


【解决方案1】:

NASM 的近调用和远调用语法与 TASM 和 MASM 不同。

这里是间接跳转的两个选项:

jmp [fptr] ; jump to CS:0x12345678
jmp far [fptr] ; jump to 0xABCD:0x12345678

fptr dd 0x12345678
     dw 0xABCD

您也可以随时将远地址压入堆栈并执行retf

【讨论】:

  • 这是不是说程序在运行之前就已经知道跳转到哪里了?万一运行后改地址呢?
  • 我不明白这个问题。
  • 对不起我的英文不好,请问:如果我在运行后更改[fptr],程序会跳转到我给他的新地址吗?我的目的是当程序运行时,我让 cpu jmp 成为 tss,而不是我改变另一个 tss2,它会 jmp 到 tss2 吗?
  • 如果您更改指针然后使用它,那么显然您使用的是更改后的指针。你问的是这个吗?
  • 是的,就是这样。我只是想知道cpu是否可以动态jmp,谢谢你的帮助。
猜你喜欢
  • 2011-08-29
  • 2011-07-25
  • 2011-05-14
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2015-05-06
  • 2012-07-19
相关资源
最近更新 更多