首页
社区
课程
招聘
[结贴]驱动中汇编调用C函数的方法
发表于: 2009-12-25 17:27 5224

[结贴]驱动中汇编调用C函数的方法

2009-12-25 17:27
5224
今天看了一段ASM的代码,想在驱动中用C内联汇编编写,论坛上搜索了也没找到
不知从何着手
ASM代码:
invoke strncmp, $CTA0("CMD.exe"), ebx, 6

要是在C语言汇编里应该怎么使用呢?
怎么调用C函数

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
又看到你了!
嗨,LZ,还是要注重基础啊;

你如果懂一些WIN32ASM,就应该知道invoke是一个宏指令,作用是调用一个函数,调用习惯类似于高级语言的,而不用在call之前,进行一系列push...push...

那么,在C语言里,直接写strncmp(... , ... , ...)就行了;

如果在C语言里内联汇编,那么直接_asm {}就行;

至于你的最后的疑问,在汇编里调用C语言?呵呵,很唐突的问题!你怎么会这样想...但是,在WIN32ASM里照样可以调用标准的系统API,而不是调用C语言,哎...

学习要讲究方法,不能只是问...
2009-12-25 17:36
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
我明白你的意思,刚才看了一个文章,
PUSH ID
PUSH IC
CALL 函数
CMP EAX,1
我只是不明白他的方法 也没有例子,是否有这样的指令 invoke  直接调用
还是得自己写一个strncmp的代码
2009-12-25 17:44
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
VOID AsmDbgPrint()
{
//asm 参数是从右到左
char  format[]  =  "%s  %s\n";
char  hello[]  =  "Hello";
char  world[]  =  "world";
    __asm
      {
         lea   eax,  world
         push  eax
         lea   eax,  hello
         push  eax
         lea   eax,  format
         push  eax
         call  DbgPrint
         //内联汇编调用C函数必须自己清除堆栈
         //用不使用的EBX寄存器清除堆栈,或ADD ESP, 12 因为压入3个参数 3*4=12 或 ret 0xC?
         pop  ebx
         pop  ebx
         pop  ebx
       }

}
结贴。。。。在驱动中调用正常,看来在C 调用汇编很麻烦呀,不过我喜欢
2009-12-25 19:35
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
pop  ebx
         pop  ebx
         pop  ebx

为什么不用?
add esp,0xC
2009-12-25 21:05
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
因为MSDN的例子是这样写的
2009-12-25 22:17
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
char szformat[] = "%s %s\n";
char szHello[] = "Hello";
char szWorld[] = " world";
void main()
{
    __asm
    {
        MOV EAX, OFFSET szWorld
        PUSH EAX
        MOV EAX, OFFSET szHello
        PUSH EAX
        MOV EAX, OFFSET szformat
        PUSH EAX
        CALL printf

        //内联汇编调用C函数必须自己清除堆栈
        //用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
        POP EBX
        POP EBX
        POP EBX
    }
}
这个是原始的代码 在驱动中错误 我改成上述的了, MSDN 那里有介绍呀 告诉我下 我去看看
2009-12-25 23:24
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
MSDN页面截图如下,最好还是不用POP EBX,而是像5楼说的用ADD ESP,
上传的附件:
2009-12-26 09:41
0
游客
登录 | 注册 方可回帖
返回
//