首页
社区
课程
招聘
[求助]关于数组类型汇编中存储形式的问题
发表于: 2011-1-31 08:06 6884

[求助]关于数组类型汇编中存储形式的问题

2011-1-31 08:06
6884
例如
一个hello,sailor!的字符串
mov eax,hello
mov [ebp-10],eax
mov ecx,hello+4
mov .[ebp-c],ecx
mov ebx,hello+8
mov [ebp-8],ebx

为啥一个字符串赋值给局部变量的时候
是ebp-大的存放字符串开始,而不是和整形变量
一样,按定义的顺序呢?
难道这样做是为了确定范围?

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
整形也是这样放的,堆栈是往下生长的,越往下越大。存放的时候从地址小的地方开始,没什么不对啊。
楼主可以在数据窗口中跳到堆栈的位置,看看数据是怎么放的。
2011-1-31 11:26
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=fzhaoqiang;921166]例如
一个hello,sailor!的字符串
mov eax,hello
mov [ebp-10],eax
mov ecx,hello+4
mov .[ebp-c],ecx
mov ebx,hello+8
mov [ebp-8],ebx

为啥一个字符串赋值给局部变量的时候
是...[/QUOTE]

你该学学王爽的《汇编语言程序设计》了
2011-1-31 11:42
0
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=fzhaoqiang;921166]例如
一个hello,sailor!的字符串
mov eax,hello
mov [ebp-10],eax
mov ecx,hello+4
mov .[ebp-c],ecx
mov ebx,hello+8
mov [ebp-8],ebx

为啥一个字符串赋值给局部变量的时候
是...[/QUOTE]

好像是局部变量都是在栈里边吧。
2011-1-31 12:03
0
雪    币: 7
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
对..以前就是发现了数组类型的总是 ebp-大的在前面这个规则
但是嫩是没注意堆栈,刚自己测试了一下确实是这样的.,.
非常低感谢...
同样感谢其他回答问题的朋友...
2011-1-31 12:38
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
6
1、堆栈是向前分配空间的,分配局部变量用到esp-n的形式,像你用汇编写程序,一个函数的开始就是:push
     ebp ; mov ebp,esp ; sub esp,n这样的形式,这样就能确保用ebp-n的形式进行局部变量的寻址
2、对齐32位的取和储存值的速度是最快的,通常的取值或存值操作最好都是按照一个dword型来取(哪怕是
   取一个字节的数据)。当然你可以用这样的形式来操作,mov al,byte ptr [ebp+n];mov byte ptr
    [ebp+1],al
3、取值,然后存放,不管是byte,word,dword的都不影响。当操作的是一个dword时,取值到寄存器,
   在内存单元的高字节会存放到寄存器的低字节位,然后存值时也是同样的方法,也就是说负负得正,因此存
   和取不会影响数据的
2011-1-31 14:35
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我记错了么?ebp+n进行的是局部变量的寻址
2011-1-31 17:58
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
8
向下增长,是越用地址越小。
2011-1-31 18:02
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
是越用越小,但是OD的那个堆栈窗口里的地址是越往下越大,搞晕了
2011-1-31 18:42
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
越往下数值越大就对了,因为最上面是栈项呀。
2011-1-31 18:48
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
11
自己写个程序,用OD调试看看不就知道了吗~~~
2011-1-31 22:48
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
12
栈是由内存高址向内存地址生长的,而字符串的识别是由内存低址到内存高址的……应该就是这个意思吧~
2011-1-31 22:49
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
13
一般ebp+n是函数的参数,ebp-n是局部变量……
2011-1-31 22:50
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
14
哦,原来是我打错,‘-’在‘+’的附近~
2011-1-31 23:11
0
游客
登录 | 注册 方可回帖
返回
//