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

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

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

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

3x

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

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

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

movzx ecx, [ebp + ebp -4]

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

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

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

movzx ecx, [ebp + ebp -4]

狂倒ING~~[/QUOTE]

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