|
主题 : : main函数的偏移地址一直是ifa [待解决] |
回复[ 6次 ]
点击[ 1186次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-04-03 15:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
/* pm.c */
main()
{
printf("%x\n",main);
}
这个是我的实验,运行后得到偏移地址是1fa。看到大家也都是这个偏移地址。我想原因是跟c0s.obj有关。
除了使用tc编译连接生成exe外,还可以使用tcc.exe tlink.exe(和汇编的masm link差不多)
如tcc -c pm.c
tlink c0s pm,pm,,cs
如果这里不使用c0s,如使用c0m.obj,打印出的值就不是1fa了。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-04-03 16:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26 |
嗯。跟你使用的起始程序有关,tc下的cos.obj下的main的偏移地址肯定是一样的1faH,以为同一个cos.obj生成的汇编代码是一样的,所以,在main函数之前的汇编指令占用的字节也是一定的。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-04-05 14:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-17 21:34 |
main函数的偏移地址不一定是01fa 。c0s总会找到main的地址!从main开始!
int f(void);
int f(void)
{
ab=a+b;
return ab;
}
int a,b,ab;
main()
{int c;
c=f();
}
你在把main偏移地址打印出来,不再是01fa!。
但是程序开始还是从01fa开始!!!
试试就明白了! | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-04-09 13:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
对啊,光用简单的main函数~\(≧▽≦)/~啦啦啦,没有全面的去想这个问题!
D:\minic>tc pm.c
20e
D:\minic>type pm.c
int f(void);
int a,b,ab;
int f(void)
{
ab=a+b;
return ab;
}
main()
{
int c;
c=f();
printf("%x\n",main);
}
D:\minic>debug pm.exe
-u 1fa
0B68:01FA 55 PUSH BP
0B68:01FB 8BEC MOV BP,SP
0B68:01FD A12604 MOV AX,[0426]
0B68:0200 03062804 ADD AX,[0428]
0B68:0204 A32A04 MOV [042A],AX
0B68:0207 A12A04 MOV AX,[042A]
0B68:020A EB00 JMP 020C
0B68:020C 5D POP BP
0B68:020D C3 RET
0B68:020E 55 PUSH BP
0B68:020F 8BEC MOV BP,SP
0B68:0211 83EC02 SUB SP,+02
0B68:0214 E8E3FF CALL 01FA
0B68:0217 8946FE MOV [BP-02],AX
- | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-04-09 13:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
不过c0s中调用的仍然是main函数
D:\minic>debug pm.exe
-u
0B68:0112 FF368600 PUSH [0086]
0B68:0116 FF368400 PUSH [0084]
0B68:011A E8F100 CALL 020E --这里原来是调用的1fah,现在时当前main函数的地址20eh
0B68:011D 50 PUSH AX
0B68:011E E84601 CALL 0267
0B68:0121 2E CS:
0B68:0122 8E1EF801 MOV DS,[01F8]
0B68:0126 E87C00 CALL 01A5
0B68:0129 0E PUSH CS
0B68:012A FF161A04 CALL [041A]
0B68:012E 33C0 XOR AX,AX
0B68:0130 8BF0 MOV SI,AX | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-04-18 23:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-15 18:50 |
楼主厉害啊,怎么知道可以换成其他文件啊,还有tcc,tlink的用法哪里有文档说明啊 | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-04-23 14:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
楼主厉害啊,怎么知道可以换成其他文件啊,还有tcc,tlink的用法哪里有文档说明啊
------------------
回复:tcc tlnk可以看他们的帮助信息,c语言有不同的内存模式,一般默认的是小内存模式也就是连接的c0s,tc的lib文件下还有除c0s外的其他文件,上网搜下就很容易找到了;)
网站首页的大学生程序设计训练营的专业课程里面也有这部分内容,在预备知识里面~~ | | |