(5)AT&T汇编笔记

(23)关于linux的命令行参数的问题:

linuxshell提示符运行程序时,linux系统为要执行的程序在内存中创建一个区域,分配给程序的内存区域可以位于系统物理内存的任何位置。为了使这一过程简化,每个程序都被分配给相同的虚拟内存地址。虚拟内存地址从地址0x80480000开始,到地址0xdfffffffff结束。Linux系统按照专门的格式把程序存放在虚拟内存地址中。

内存区域中的第一块区域包含汇编程序的所有指令和数据(来自.bss段和.data段)。指令不仅包含汇编程序的指令代码,而且包含linux运行程序的链接过程所需的指令信息。

内存中的第二块区域是程序堆栈。堆栈从内存区域的底部向下增长。于是,可能大家会认为程序每次启动的时候,堆栈指针都被设置为0xbfffffffff,但是情况并非如此。在加载程序之前,linux把一些内容放到堆栈中,命令汗参数就在这里。看下图表示:


0x00000000环境变量段的结束标志

环境变量命令行参数

指向环境变量的指针

0x00000000此处命令行参数的结束标志

………………………………

指向命令行参数2的指针

指向命令行参数1的指针

程序名称

参数数目



……

……

程序代码和数据 0x80480000

问题来了,既然是虚拟内存地址,那么堆栈指针esp也被初始化为了虚拟内存的地址。那汇编指令是怎么实际的执行和操作硬件堆栈的呢?

这个答案在操作系统加载执行汇编程序的时候,这个时候操作系统负责解读和转换映射虚拟内存地址到系统物理内存地址。记住操作系统在执行我们写的程序的时候,是一种虚拟的抽象环境,实际内存的管理还是操作系统在负责

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值