能力值:
( LV9,RANK:280 )
|
-
-
2 楼
又看到你了!
嗨,LZ,还是要注重基础啊;
你如果懂一些WIN32ASM,就应该知道invoke是一个宏指令,作用是调用一个函数,调用习惯类似于高级语言的,而不用在call之前,进行一系列push...push...
那么,在C语言里,直接写strncmp(... , ... , ...)就行了;
如果在C语言里内联汇编,那么直接_asm {}就行;
至于你的最后的疑问,在汇编里调用C语言?呵呵,很唐突的问题!你怎么会这样想...但是,在WIN32ASM里照样可以调用标准的系统API,而不是调用C语言,哎...
学习要讲究方法,不能只是问...
|
能力值:
( LV9,RANK:200 )
|
-
-
3 楼
我明白你的意思,刚才看了一个文章,
PUSH ID
PUSH IC
CALL 函数
CMP EAX,1
我只是不明白他的方法 也没有例子,是否有这样的指令 invoke 直接调用
还是得自己写一个strncmp的代码
|
能力值:
( 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 调用汇编很麻烦呀,不过我喜欢
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
pop ebx
pop ebx
pop ebx
为什么不用?
add esp,0xC
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
因为MSDN的例子是这样写的
|
能力值:
( 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 那里有介绍呀 告诉我下 我去看看
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
MSDN页面截图如下,最好还是不用POP EBX,而是像5楼说的用ADD ESP,
|
|
|