首页
社区
课程
招聘
[求助] 关于C内联汇编中的变量重定位问题
发表于: 2008-8-25 01:41 7040

[求助] 关于C内联汇编中的变量重定位问题

2008-8-25 01:41
7040
lea ecx,szDll[ebp]
push ecx
call LoadlibraryA_Addr[ebp]

szDll db "shell32.dll"        <------这里可以直接定义一个变量
LoadlibraryA_Addr dd 0

内联汇编:

_asm         push DWORD PTR 0x006C6C64
_asm         push DWORD PTR 0x2E32336C
_asm         push DWORD PTR 0x6C656873   //shell32.dll
_asm    push esp
_asm    mov ecx,[esp]        //保存shell32.dll字符

第一种纯汇编,可以直接定义szDll db "shell32.dll",而在C内联汇编只能:
_asm         push DWORD PTR 0x006C6C64
_asm         push DWORD PTR 0x2E32336C
_asm         push DWORD PTR 0x6C656873   //shell32.dll

如果这样:

char szDll[]="shell32.dll";

_asm lea ecx,szDll  ;这样就无法编译通过了。请问C内联汇编怎么解决呢?

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
不知道我问得明白了没
2008-8-25 01:42
0
雪    币: 184
活跃值: (75)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
VC++6

char szDll[]="shell32.dll";
_asm lea ecx,szDll

测试通过
2008-8-25 03:15
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
编译是可以编译通过,但是调式得时候,eax实际就是下面值:
上传的附件:
2008-8-25 03:59
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
eax并非为shell32.dll
2008-8-25 03:59
0
雪    币: 184
活跃值: (75)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
_asm lea ecx,szDll
d ecx
2008-8-25 04:26
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7
d ecx   这句指令是啥意思捏

我确实是
char szDll[]="shell32.dll"

_asm lea ecx,szDll  但是OD调式知道,ecx并没有指向shell32.dll这个字符。
2008-8-25 06:17
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
学学自己Debug
2008-8-25 08:42
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我试过, 没有你所说的问题~~
2008-8-25 09:22
0
雪    币: 202
活跃值: (558)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
10
不了解
有些文章说   内联ASM需要声明变量和寄存器的对应关系    ?
2008-8-25 10:30
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
麻烦这位兄弟贴一小段代码
2008-8-25 18:12
0
雪    币: 177
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
//VC6, VC7.1 运行正常

#include <stdio.h>

char format[] = "dll name = %s\n";

int main( void )
{
    char szDll[] = "shell32.dll";
    __asm
    {
        lea  eax, szDll
        push eax
        mov  eax, offset format
        push eax
        call printf
        pop  ebx
        pop  ebx
    }
}

上传的附件:
2008-8-27 02:06
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13
mov ecx,szDll
2008-8-27 11:07
0
雪    币: 177
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主的是ecx , 把程序中的 eax 改为 ecx 就行了(还有后面的一个push)
2008-8-27 19:39
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
15
搞定。嘿嘿  谢谢各位
2008-8-28 07:10
0
游客
登录 | 注册 方可回帖
返回