【发布时间】:2015-07-29 02:05:55
【问题描述】:
我不确定 x86 程序集是否可以实现这样的事情,但我可以
mov eax, string
call string
my_funct:
mov ebx, hi_msg
call puts32 ;say hi
ret
string db 'my_funct', 0
hi_msg db 'Hi', 0
我知道我想在地址处调用标签并且我给它一个字符串但是我可以将字符串转换为地址吗?如果是这样怎么办?当我尝试任何关于我可能如何做到这一点的建议时,似乎是三重错误?
感谢 superultranova、scott Hunter 和其他发帖但被删除的人,我认为 esm 是您的回复和帮助。我想出了
pop ebx ;num from stub
mov al, 2
mul bx ; mul 2 to correct offset (our funct_ptr are word not byte)
mov ebx, eax
mov eax, [funct_ptr + ebx]
call eax
funct00:
nop
ret
funct01:
mov ebx, hi_msg
call puts32 ;say hi
ret
funct02:
;not implemented
ret
funct_ptr:
dw funct00, funct01, funct02, 0
【问题讨论】:
-
你不能做你想做的事,它只是在 x86 中不起作用,因为编译后的二进制文件中不存在标签作为可以调用的东西。如果您能解释为什么要这样做,以及出于什么目的,也许还有其他选择。
-
我正在设计一个存根函数,它将东西压入堆栈,其中一项是 0 到 255 之间的数字。另一个函数(我在上面尝试做的事情)使用这个数字并进一步修改字符串例如。 'funct00' 到 'funct1A' 并从一组标记为 funct00: 到 functFF: 的预先编写的函数中调用它:
-
您可以布置一个函数指针(地址)表,以这样一种方式存储函数指针(地址),以便在解析字符串中的十六进制数字时找到正确的指针。本质上,有一个 FF 指针表,并根据您从字符串中解析出的数字对其进行索引,然后调用该地址。
-
不客气,我想我会写下这条评论作为答案。