首页
社区
课程
招聘
[求助]汇编的几个小问题
发表于: 2009-1-6 19:29 3570

[求助]汇编的几个小问题

2009-1-6 19:29
3570
为了看懂反汇编代码,开始看汇编的书,写了如下测试代码,想在OD里面相互印证
.data 
szMsg byte "Hello World",48h,0
szCaption byte "title",0
wdTest byte 8 dup(20)
 
.const
dwNum dword 48h
 
.code 
start: 
    invoke MessageBox,0,offset szMsg,offset szCaption,0
    ret
end start


在OD里面,数据如下:
00403000  48 65 6C 6C 6F 20 57 6F 72 6C 64 48 00 74 69 74  Hello WorldH.tit
00403010  6C 65 00 14 14 14 14 14 14 14 14 00 00 00 00 00  le......
00403020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00403030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

有几个疑问,麻烦大家帮忙看一下:
1.const数据,放的地方和变量不一样吗?
2.我有定义wdTest byte 8 dup(20),为什么在下面是这么多个14?
3.OD里面,反汇编的地址,是真实的物理地址吗?好像每次启动同一个程序的时候,地址都是一样的

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
答:
1.不清楚,没研究过,但肯定都是在内存中
2.20D=14H
3.不是真实的物理地址,关于每次地址都是一样的问题,请参考PE相关文章
2009-1-6 20:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢,我去看看去

第二点,原来我把DUP前后两个数字的意义看错了,以为是分配20个值为8的空间
2009-1-6 20:35
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
const数据,放的地方和变量不一样吗?

答:应该是不一样的,变量的所在区段应该可写....
    常量应该不可写...
2009-1-6 22:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1.const数据,放的地方和变量不一样吗?
不一样,const数据可读不可写,变量数据可读可写,所以他们在不同的节里。
3.OD里面,反汇编的地址,是真实的物理地址吗?好像每次启动同一个程序的时候,地址都是一样的?
OD里面反汇编的地址是可执行文件加载到内后的虚拟内存地址,每次启动同一个程序地址一样,是因为可执行文件的PE文件信息中已经包含了不同的数据节相对于pe文件头的偏移地址,也包含了系统加载该文件时的起始地址,所以每次启动同一个程序,地址都是一样的。
2009-1-9 01:13
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1.如果采用VC里面的#pragma data_seg宏,不知道是否能弄到同一个段里面,我没有试过。不过一般情况下是不在一个段里面的。
2.windows的内存管理简化了程序员的编写工作,可以说所有的程序都是在虚拟地址上工作的,它采用flat模式的虚拟地址,所有程序都拥有独立的0~4G虚拟空间,当程序运行的时候,系统将运行的程序映射到虚拟地址空间,然后由系统的内存管理程序将运行的程序变换成实际物理地址。所以OD反汇编的时候是虚拟地址,不是真实的物理地址。看看PE文件格式的内容,就不难理解这些了。
2009-1-9 10:58
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
先声明我很菜~我怎么觉得不再内存里呢?~~系统应该汇编时应该是用48h代替dwNum吧~个人感觉~
2009-1-9 15:32
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
1.const数据,放的地方和变量不一样吗?

以前也没注意过,刚试验了下,貌似一样。。。

#include <iostream>

int main()
{
	const int a = 0;
	int b = 1;

	return 0;
}


转换为

00401000  /$  55            PUSH EBP
00401001  |.  8BEC          MOV EBP,ESP
00401003  |.  83EC 08       SUB ESP,8
00401006  |.  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
0040100D  |.  C745 F8 01000>MOV DWORD PTR SS:[EBP-8],1
00401014  |.  33C0          XOR EAX,EAX
00401016  |.  8BE5          MOV ESP,EBP
00401018  |.  5D            POP EBP
00401019  \.  C3            RETN


可以看出 const int 和 int 都是在栈里分配内存的。
2009-1-9 21:04
0
游客
登录 | 注册 方可回帖
返回
//