当前位置:  技术问答>linux和unix

有一个参数在栈中传递的问题

    来源: 互联网  发布时间:2015-05-22

    本文导语:  简单编一个main.c,main函数内调用一个my_nop(int *)函数,该函数如下: #include  int my_nop(int *a){         int i=1;         (*a) += i;         return 0; } int main(int argc,char *argv[]){        int j=0;        ...

简单编一个main.c,main函数内调用一个my_nop(int *)函数,该函数如下:
#include 

int my_nop(int *a){
        int i=1;

        (*a) += i;
        return 0;
}
int main(int argc,char *argv[]){
       int j=0;

       j += my_nop(&j);
       return 0;
}

编译成后,用objdump看到my_nop函数部分如下:
:
55                              push   %ebp
89 e5                           mov    %esp,%ebp
83 ec 04                        sub    $0x4,%esp
c7 45 fc 01 00 00 00            movl   $0x1,0xfffffffc(%ebp)
8b 4d 08                        mov    0x8(%ebp),%ecx
8b 55 08                        mov    0x8(%ebp),%edx
8b 45 fc                        mov    0xfffffffc(%ebp),%eax
03 02                           add    (%edx),%eax
89 01                           mov    %eax,(%ecx)
b8 00 00 00 00                  mov    $0x0,%eax
c9                              leave
c3                              ret

可以看出,main函数在调用my_nop函数之前,把参数j的地址放在栈中,进入my_nop函数后,ebp和esp首先被调整,在my_nop内部,用ebp的值加8作为地址,去取main函数先前放置在栈中的参数j的地址。让我感到困惑的是这句:
add (%edx),%eax 和
mov    %eax,(%ecx)
ecx、edx寻址,其段基址是由DS给出的,而j其实是存放在栈中的(main的局部变量),我觉得应该是
add ss:(%edx),%eax 和
mov    %eax,ss:(%ecx)
我错在哪里?难道linux中SS=DS?
请知情者不吝赐教!

|
是的。你可以看看Linux的启动源代码的初始化GDT表的部分
具体的代码我给你贴一下吧
/usr/src/linux-2.4/arch/i386/kernel/head.S
----------------------------------------------------------
ENTRY(gdt_table)
.quad 0x0000000000000000 /* NULL descriptor */
.quad 0x0000000000000000 /* not used */
.quad 0x00cf9a000000ffff /* 0x10 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff /* 0x18 kernel 4GB data at 0x00000000 */
.quad 0x00cffa000000ffff /* 0x23 user   4GB code at 0x00000000 */
.quad 0x00cff2000000ffff /* 0x2b user   4GB data at 0x00000000 */
.quad 0x0000000000000000 /* not used */
.quad 0x0000000000000000 /* not used */
/*
 * The APM segments have byte granularity and their bases
 * and limits are set at run time.
 */
.quad 0x0040920000000000 /* 0x40 APM set up for bad BIOS's */
.quad 0x00409a0000000000 /* 0x48 APM CS    code */
.quad 0x00009a0000000000 /* 0x50 APM CS 16 code (16 bit) */
.quad 0x0040920000000000 /* 0x58 APM DS    data */
.fill NR_CPUS*4,8,0 /* space for TSS's and LDT's */
----------------------------------------------------------------------------
注意 .quad 0x00cf9a000000ffff /* 0x10 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff /* 0x18 kernel 4GB data at 0x00000000 */
.quad 0x00cffa000000ffff /* 0x23 user   4GB code at 0x00000000 */
.quad 0x00cff2000000ffff /* 0x2b user   4GB data at 0x00000000 */
应该写的很清楚了吧?

    
 
 

您可能感兴趣的文章:

  • url能传递参数吗?怎样才能传递参数(比如查询结果)
  • 在页面间传递参数时,接受参数的页面如何读取参数值啊??在线等待……
  • 我想在?好后面传递参数,参数中包含汉字时。就出现乱码。我该怎么办?
  • Jquery easyui之控件参数传递方法
  • gtk 回调函数的参数传递问题!
  • 在线求救!!!如果在JSP页面之间传递多个参数?
  • 关于Makefile传递参数
  • 有关往脚本中传递参数的问题?
  • probe函数参数传递过程?
  • Qt中利用槽如何来传递参数
  • java中如何使参数传递按传"引用"方式进行?
  • 参数传递小问题
  • JSP页面中文传递参数使用escape编码
  • url传递特殊参数的问题!
  • 高分求救!JSP的参数传递问题?
  • GET方法URL中传递中文参数乱码的解决方法
  • 多线程参数传递
  • 参数传递问题!
  • 有关硬盘参数的死问题,100分! iis7站长之家
  • response.sendRedirct() 的中文参数传递问题
  • 问一个关于在shell中调用内置命令时参数的问题?参数从空格处被断开
  • shell参数问题 if [ x$current == x$required ]; 中参数前的x是什么意思
  • 关于参数的小问题!非常菜的问题!
  • 函数参数入栈顺序以及参数地址间隔的问题
  • 有关硬盘参数的死问题,100分!
  • 关于gcc -fno-strict-prototype 参数的问题
  • 编译参数问题,初学者的问题,请多帮忙
  • Linux0.11 内核源码 main函数的参数问题
  • 请教高手glade中的参数问题
  • corba枚举类型参数传递问题?(大笨鸟问题)
  • ### shell awk 参数问题!! --- 急啊 ----
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python函数默认参数和字典参数及可变参数(带星号参数)
  • applet传参数到serlvet,后,如果参数后面有空格,则后面的参数。。。
  • ndk下编译ffmpeg的configure命令及配置参数
  • 做网页有时会用到"HTTP_USER_AGENT"或"REMOTE_ADDR"这样的参数,这到底是一个什么参数,如何得知这一类参数的全部信息?谢谢
  • Linux下curl的下载,安装以及curl命令的详细参数,用法介绍
  • c# 可选参数、命名参数
  • c++模板(Template)介绍及模板参数中包含模版
  • 有谁知道命令后加-的参数和不加-的参数有什么不同?
  • C++可变参数模板(variadic template)详细介绍及代码举例
  • 如何实现linux下ant调用sh(带输入参数),参数自动填入并执行sh
  • ​Docker 1.12.0 改进了服务的负载均衡参数
  • ls --color[=when] 参数为never always auto,这三个参数分别什么意思。
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 深入解析Oracle参数及参数文件
  • linux下top命令详解包括top命令参数使用及结果(virt,res,shr)排序举例说明
  • shell 参数数目不固定如何遍历(主要原因是包含带空格的参数)
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • shell创建一个带参数的文件名,这个参数怎么不显示出来backup$BDATE.dump
  • 请问方法中参数个数相同但参数类型不同,该算是overload(重载)吗?
  • c# 泛型类创建带参数和不带参数的构造方法
  • unix shell 下进程的命令行参数与源程序 main函数的入口参数 是同一回事吗? 第一次编 .sh 文件,哪一位肯帮忙?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3