masm使用

yusss 2014-04-27 08:22:07
写一段汇编,在这个汇编里生成一个函数指针表,然后在C语言里使用这个表:
.686P
.MODEL FLAT,c

public _SysguardDispatch

.CODE
_SysguardDispatch:

hook macro syscall:REQ
LOCAL lbl;;
.CODE
lbl:
mov eax , syscall
jmp DWORD PTR _SysguardDispatch
;;函数指针表
.DATA
dd lbl
endm

num = 0
WHILE num LE 10
hook(num)
num = num + 1
ENDM

END

问题是如何导出这个函数指针表呢?
...全文
145 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2014-04-30
  • 打赏
  • 举报
回复
; 也许可以这样吧
.686P
.MODEL FLAT,c

option casemap:none

public _SysguardDispatch


.data
arPtrs label dword
forc i, 0123456789
dd lbl&i
endm


.CODE

forc x, 0123456789
lbl&x:
mov eax, x
jmp dword ptr _SysguardDispatch
endm

_SysguardDispatch:
; your dispatch code here

END
fhqdx0012 2014-04-30
  • 打赏
  • 举报
回复
用汇编写lib文件然后在c里引用lib ....
yusss 2014-04-30
  • 打赏
  • 举报
回复
引用 10 楼 zara 的回复:
; 也许可以这样吧
.686P
.MODEL FLAT,c

option casemap:none

public _SysguardDispatch


.data
arPtrs label dword
  forc i, 0123456789
    dd  lbl&i
  endm


.CODE

  forc x, 0123456789
    lbl&x:
      mov eax, x
      jmp dword ptr _SysguardDispatch
  endm

_SysguardDispatch:
; your dispatch code here  

END
不错,可以了。非常感谢。
zara 2014-04-29
  • 打赏
  • 举报
回复
首先,既然是指针表,那就应是个指针数组的形式吧,你上面的应该不是了,所以在数据组织上应该变化下,将它们放在一起:
.686P
.MODEL FLAT,c
option casemap:none

public _darEntries

.data
_darEntires dd 10 dup (0)

.CODE
; 随便用什么方法创建上面的数组了
END


在 c 里可以这样使用刚才定义的 _darEntries[code=c++]#include "stdio.h"
#include "stdlib.h"

extern "C" int *_darEntries[];

void main(void)
{
int i;

for (i = 0; i < 10; i++)
printf("%08x ", _darEntries[i]);
}[/code]
yusss 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 zara 的回复:
你准备怎么在 c 里使用这个指针,是分别将c 和汇编创建为不同的模块由 c 来调用汇编的(如 c 为 exe 汇编是 dll),还是要将它们生成一个最终的程序文件?如果是前者,就是 #2 的方法;如果是后者,汇编里将指针申明为 public,c 里 extern 说明下就可以使用了,但不同语言间的符号名转换规则要知道,否则就会出现找不到某符号定义的链接错误。
后者。问题是我不知道在哪个为止定义这个符号,你能修改一下我贴的代码给我示范一下吗?
zara 2014-04-29
  • 打赏
  • 举报
回复
你准备怎么在 c 里使用这个指针,是分别将c 和汇编创建为不同的模块由 c 来调用汇编的(如 c 为 exe 汇编是 dll),还是要将它们生成一个最终的程序文件?如果是前者,就是 #2 的方法;如果是后者,汇编里将指针申明为 public,c 里 extern 说明下就可以使用了,但不同语言间的符号名转换规则要知道,否则就会出现找不到某符号定义的链接错误。
yusss 2014-04-29
  • 打赏
  • 举报
回复
你说的"随便"恰恰是我最关心的
yusss 2014-04-29
  • 打赏
  • 举报
回复
如按照你这个写法,如何把需要的函数指针填充到这个数组中呢?我的代码中是用宏来生成代码的,在生成代码的同时就把函数入口填充到数组中。现在的问题是没法为这个数组定义符号。
yusss 2014-04-28
  • 打赏
  • 举报
回复
引用 2 楼 zara 的回复:
何谓“导出这个函数指针表”?是说在其它模块里可以它吗?可能需要通过个导出函数,调用该函数即返回该表地址。
就是需要给这个函数指针表赋一个符号,我不知道怎么赋
zara 2014-04-28
  • 打赏
  • 举报
回复
何谓“导出这个函数指针表”?是说在其它模块里可以它吗?可能需要通过个导出函数,调用该函数即返回该表地址。
fly 100% 2014-04-28
  • 打赏
  • 举报
回复
给这个指针表付个首地址的值呢

21,498

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧