首页
社区
课程
招聘
VC内联汇编问题求助
发表于: 2009-12-29 19:27 6723

VC内联汇编问题求助

2009-12-29 19:27
6723
编译环境:XP  VC++6.0

  • #include "stdafx.h"

  • int iArray[10];
  • struct Person
  • {
  •   int Age;
  •   int ID;
  • };

    [*]int main(int argc, char* argv[])
  • {
  •   __asm
  •   {
  •     mov ebx,0x0010
  •       mov iArray[6*  type int],ebx
  •   }

  •   printf("iArray[6]=%d\n",iArray[6]);
  •   int ages;
  •   struct Person tom;

  •   tom.Age = 20;
  •   tom.ID  = 2000;

  •   __asm
  •   {
  •     lea ebx,tom
  •     ;mov ebx,offset tom  ;
  •     mov ecx,[ebx]tom.Age
  •     mov ages,ecx
  •   }
  •   printf("Age : %d",ages);
  •   return 0;
  • }


问题:
    lea ebx,tom
    ;mov ebx,offset tom  ;换成下面一句编译会出错为什么.
   -----------------------
   我的理解:
   lea bx,list
   mov bx,offset list 指令功能上应该是相同的.

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

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
会不会是地址的长度问题?
2009-12-29 19:32
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感觉同楼上~
2009-12-29 19:51
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
offset应该不能用在C中的变量上
2009-12-29 20:50
0
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
你那句MOV相当于
mov ebx,dword ptr[tom]
2009-12-29 21:15
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
迷糊,对了,楼主有没有关于VC内联方面的经典电子书啊,,小弟对这个蛮感兴趣的,希望楼主不吝赐教。
2009-12-29 21:45
0
雪    币: 34
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
VC内联方面的电子书 我倒没有,我也是初学这个.可以看看 <<0day:软件漏洞分析技术>> 上面有些这方面的内容 . 网上有些入门的,我前两天找到的http://www.cppblog.com/xingkongyun/archive/2008/12/21/70003.html
2009-12-30 12:01
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
bx   和 ebx 你理解下先.
2010-1-1 01:47
0
雪    币: 141
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
bx是ebx的一部分
2010-1-1 12:52
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
tom  改成全局变量就可以  了
mov ebx,offset tom
2010-1-1 23:23
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
好像用addr来定位它的地址可以...
2010-1-3 02:57
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
进来学习学习
2010-1-3 08:34
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
printf("iArray[6]=%d\n",iArray[6]);  
  int ages;  
  struct Person tom;

  tom.Age = 20;  

tom是局部变量,汇编里局部变量取地址用addr,全局变量用offset

故该问题有2种解决办法:

1.把tom定义为全局变量

2.把 mov ebx,offset tom   改为  mov ebx,addr tom

楼主可根据自己的喜好选择处理。
2010-1-3 12:00
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
addr倒是学到了
话说是因为局部变量都是用的[ebp+x]这样的原因么
2010-1-3 12:02
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=resty;738387]addr倒是学到了
话说是因为局部变量都是用的[ebp+x]这样的原因么[/QUOTE]

addr是指令在内存中的地址,offset是指在编译器在编译的时侯产生的偏移量,在exe文件中,这个地址会被相应的偏移量所代替,在装入时会被重定位机制修改.
2010-1-8 01:28
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
ebp+x的原因,是因为参数压栈之后,会保存call下个地址,及esp,然后把esp mov给ebp。再压入局部变量,所以变量是可以用ebp+x来表示的。这个你要看下各种调用方法的压栈原理。。
2010-1-8 08:42
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
bx是16位,ebx是32位,此环境中默认为32位,改了当然不行
2010-1-8 09:41
0
雪    币: 34
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢各位解答.. 学习了.....
2010-1-8 12:55
0
游客
登录 | 注册 方可回帖
返回
//