LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: nuclearweapon

shell执行 程序的问题??高手指教~~~!!!

[复制链接]
 楼主| 发表于 2004-10-10 18:31:34 | 显示全部楼层
我在数据区
.data
num: .int 5,6,7
用gdb调试
num的地址是0x80490a8
x/1wd 0x80490a8 输出  5
x/1wd 0x80490ac 输出  6

x/1wd 0x80490aa 输出是乱码.

只有32位操作系统才是int 占4位的 .

还是实验出来的东西最有用~书上还有一个地方 是这个问题~~(这都是dos 下没有的)\\
发表于 2004-10-10 19:21:50 | 显示全部楼层
你不要把.int和整型搞混了。.int是汇编指令,不是声明整型。看看这个:
http://www.cs.utah.edu/dept/old/texinfo/as/as.html#SEC81
从这个as的说明书来看,现在的as已经把.int和.long当成一样的来处理了。如果都把.int和.long当成4个字节处理,发生这个问题不奇怪。
发表于 2004-10-10 19:25:12 | 显示全部楼层
最初由 nuclearweapon 发表

只有32位操作系统才是int 占4位的 .

还是实验出来的东西最有用~书上还有一个地方 是这个问题~~(这都是dos 下没有的)\\

32位的表示cpu的字长,和操作系统没有关系。
32位的体系结构也可以表示8位、16位的整数。不一定都是4个字节。
发表于 2004-10-10 19:45:28 | 显示全部楼层
最初由 nuclearweapon 发表
我的意思是这样~~
按照at&t的习惯
被调用函数首先要作的是
pushl %ebp
movl  %esp,%ebp
那么调用函数传递给 被调用函数的参数就可以通过%ebp来访问.
而且对于32位的操作系统来说 第一个参数的地址是8(%ebp).

我昨天想试试 系统传递给程序的参数(也就是 c语言中的int argc和 char * argv[])
但是我用gdb调试得时候发现:
1.argc的地址不在8(%ebp)而是在4(%ebp)
  后来我就想这不是没有了return address?
  一时没有想清楚~

想发贴求证一下,  因为 一般情况下 很手考虑这种问题的

对于正常函数调用,调用函数之前要把参数逆序压栈,然后call指令把返回地址压栈,再跳转执行被调用的函数。这样,加上进入被调用函数时保存的ebp,第一个参数的地址是8(%ebp),但对于进程的入口点main函数来说,它没有调用它的函数,自然不应该有这个返回地址。
 楼主| 发表于 2004-10-10 22:51:00 | 显示全部楼层
.int 是汇编的命令 这我知道~~ 我没有说这是什么声明~~
我一直说明的是 programming from ground up这本书的问题.至于现在的as说明文件中的东西,只说明这本书的现在出现了这个问题.和我把它当成什么 没有关系把.

programming from ground up上说.int占2个子节.(65535 书上说的)
(我相信斑竹看了这本书~~不知道当时是否实验过??你怎么能说这本书他是32位得呢?记住我说的是这本书.)


.int 一般都是和机器子长联系在一起的.按照习惯,在 32位机上, 没人会把.int用作8(不知斑竹在哪里见过,哪个汇编器.要是有就指出来,没有就是没有.)

我说32位的linux当然也就是32位的体系结构了了
.难道有16位的体系结构用32位的linux这里我强调得是和dos的对比~(可以理解的吧!!)

至于我提的 这个问题~~我也给了解释.和你说的差不多~~(我在回贴说"没有返回地址"的时候也就想清楚了,后来我给了说明.)
你第一次回贴为什么就不好好说了呢?

为什么你只引用我的一半的贴子呢????为什么不引用完呢?

你不引用完我的帖子是为什么?我后边说的有错马?

肯定有原因把~~
请斑竹回答!!!!!




说点别的~~:
可能口气不太好~大家多见谅
斑竹别见怪~,你回这个的第一贴,口气很让人生气!!!!(可能使我多心了)
我经常来里linuxsir的..至于大家的热心我就不多说了.

难道非要把自己知道的都说出来,你(斑竹)才认为这个人才能看懂书马?
难道非要把自己知道的都说出来,你(斑竹)才认为这个人才能看懂书马?
发表于 2004-10-11 15:51:13 | 显示全部楼层
呵呵,你还真能较劲~~!
书上是说.int声明了的数字只占两个字节。我用objdump看过反汇编的可执行文件了。确实是占用了4个字节。这说起来应该是书上一个错误,但我想不清楚是不是作者用的as汇编程序和我们的不一样,因为我们的as汇编程序版本很新,这是我用的:

  1. [kj501@s2023 asm]$ as --version
  2. GNU assembler 2.14.90.0.7 20031029
  3. Copyright 2002 Free Software Foundation, Inc.
  4. This program is free software; you may redistribute it under the terms of
  5. the GNU General Public License.  This program has absolutely no warranty.
  6. This assembler was configured for a target of `i586-mandrake-linux-gnu'.
复制代码

可见我们用的已经是最新版本了。所以我才去网上查找as的说明书,找到http://www.cs.utah.edu/dept/old/texinfo/as/as.html#SEC81
从这个说明书的内容来看,现在.int已经和.long等同了。一般来说,需要区分16位整型和32位整形的是为了与过去的版本保持兼容,如果汇编程序一开始就是就把整数定义成32位的,没有必要支持两个实际效果一样的汇编指令。所以从这个现象来说,我认为作者使用的as汇编程序版本比较老,可能声明的.int是占两个字节的。他书中的错误是因为软件的发展造成的,我相信以后他会在书中修正这个错误。
 楼主| 发表于 2004-10-13 00:41:53 | 显示全部楼层
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表