首页
社区
课程
招聘
[求助]一个嵌入汇编的小问题
发表于: 2008-7-10 11:21 5509

[求助]一个嵌入汇编的小问题

2008-7-10 11:21
5509
编译器:vc6
用嵌入汇编如下:
wchar_t wcTest[0x10] = T("hello");

for(int i = 0;  i < 0x10; i++)
{
__asm
{
   pushad
....
    movzx  ecx,  wcTest[i]   // 这里引发一个异常,请问是怎么回事?该如何写才能正确呢?
...
   popad
}
}

3x

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
把那句换成下面两句试试
mov eax, i;
movzx  ecx,  wcTest[eax * TYPE wchar_t];
当然我这个是猜测那个指令的意图 不一定正确
2008-7-10 13:52
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主可以看看编译出来的代码,ecx会不会被用来循环,比如Loop什么的,然后wcTest[i]可能会变成wcTest + ecx*2,ecx被赋值导致地址不可访问?
我也只是猜测,最好看看编译出来的目标代码。怀疑ecx其他地方被使用
2008-7-10 15:28
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
VC6就不要用了BUG太多.

movzx  ecx,  wcTest[i]返汇编出来的结果居然是

movzx ecx, [ebp + ebp -4]

狂倒ING~~
2008-7-11 10:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如上所述,编译出来的代码有问题,导致非法访问内存
2008-7-11 15:37
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不是 ecx的问题, 他前面已经pushad 了, 你调用的是局部变量,不要用
movzx  ecx,  wcTest[i]
计算出 wcTest的偏移比方是xx
用 movzx ecx. [ebp+xx+i*2] 就好了

或者直接
static wchar_t wcTest[0x10] = T("hello");
2008-7-13 14:49
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=writer15;479366]VC6就不要用了BUG太多.

movzx  ecx,  wcTest[i]返汇编出来的结果居然是

movzx ecx, [ebp + ebp -4]

狂倒ING~~[/QUOTE]

那么就是说VC6对嵌入汇编的数组索引访问编译有bug,呵呵
2008-7-14 10:34
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
所以,看起来嵌入汇编不能用数组索引,最好使用正规的汇编寻址方式,像6楼那样
2008-7-14 10:36
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
内联汇编不如naked干脆,否则,有时候编译出来莫名其妙的
2008-7-16 18:31
0
游客
登录 | 注册 方可回帖
返回
//