网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月01日漏签0天
c语言吧 关注:801,793贴子:4,376,122
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 首页 上一页 1 2
  • 22回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

回复:深夜布道!C调用的汇编级解释!以及stdcall和cdcel 不加精对不

  • 取消只看楼主
  • 收藏

  • 回复
  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:19楼


  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:30楼
这是为了解释C过程调用而介绍的32位保护模式下汇编。不是我不会16位汇编。另外这也不是汇编教程。但是我想我确实给出了汇编最本质的内容。对于汇编介绍,概念清晰而且足够简单才是本文应该关注的。
关于16位汇编到32位保护模式之间的切换,涉及的内容比较复杂,不是本文这篇幅能够介绍的。有兴趣的童鞋可以参考于渊《一个操作系统的实现》,里面相当清楚的介绍了切换内容。觉得自己英文NB的也可以直接参考Intel CPU说明书第三卷。但是我想能把那本书搞定并自己动手实践自己的操作系统的童鞋不需要看这篇文章了吧。
另外再修正自己的一个错误:
mov eax, [ebp + 8]       ;复制第二个参数值(var2)到eax
mov eax, [ebp + 12]      ;加上第一个参数值(var1)
//这里应该是add eax, [ebp + 12]


2026-03-01 17:06:29
广告
不感兴趣
开通SVIP免广告
  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:42楼
栈本来就是运行时建立起来的。
当一个程序还作为一个文件在硬盘上躺着时,哪里来“栈”的概念?
程序被加载到内存中后,函数、全局变量的地址才在内存中被确定下来。当然栈也是在此时初始化的了。初始化就是给一个地址作为栈的起始点,以后的入栈出栈都是在这个起始点上操作吧。所以“栈”叫做“运行时栈”。
比较麻烦的是多线程库,它应该会为每一个执行流都建立一个栈(具体的实现我不知道,纯属猜测)。


  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:44楼
一点都不抽象。
你写了一个程序,然后编译器编译并链接好你的程序。这时你的程序只是是一个可执行文件对吧?--你还没有去运行你的程序,它还是一个文件--只不过是带有某些表头信息之类的二进制文件--但终究还是一个文件对吧,它这时是不是还在你的硬盘上?--你还没去执行它呢。
当然了,你写了程序自然是要去执行它的。当你去执行你的程序的时候,操作系统首先要做一件事情,就是把你的程序从硬盘上“读”到内存中。这个过程叫做程序加载。
程序加载完毕,你的程序的那些指令的地址才在内存中被确定,这时你的程序就不再叫“可执行文件了”,而是叫“进程”,因为这时你的程序才开始活动,也就是被CPU执行。--这些从概念上来讲是很基础的东西啦哥们(实际实现就非常复杂)。进程是一个运行时概念。而可执行文件是一个静态概念。
当然,栈是进程中的东西啊。那些所谓的代码段、数据段、堆、栈都是指一个程序在运行起来之后它在内存中的布局啊。
所以栈是在程序刚开始运行时被初始化的,这不是很容易理解吗~


  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:46楼
千万别...偶会被真正滴大虾嘲笑滴...


  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:48楼
啊,你的签名我受不了啊~


  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这贴都忒老了... 又被挖坟。
局部变量的生命周期跟函数栈帧的生命周期一样,怎么是永久的?局部变量就分配在栈上,在汇编代码的表现就是减esp值就可以了。
全局变量的生存周期才是和整个进程一样的。这种变量像程序代码一样,直接在装载时就分配好,进程退出时再销毁。
EIP是可以修改,JMP或者CALL指令都会修改EIP。但是这种修改是间接的,程序员不能直接用MOV指令去修改它。至于SEH异常处理链之类的,我表示你扯远了。
关于页表修改与页提交之类的,这个跟PAE有关系吗?操作系统在任何时候都可能做修改页表、换页之类的操作,起新进程时要,分配内存也要,栈空间超过4KB(32位系统上一页的大小)也要对吧。现代操作系统的内存管理是建立在这类事情的基础上的。
至于PAE,很烦这种扩展特性。32位系统就32位系统,非要弄36根地址线来扩展物理地址空间,给操作系统代码和移植带去大麻烦。


  • elf0223
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
OK.
1. 变量存在于栈中, 暂时不会消失, 但只要你再调用一个新的函数, 就基本十分的可能覆盖你的变量原来在栈上的数值,除非你新调用的函数什么都没干。因此这个变量的生命周期当然就是运行时和其所在函数调用绑定在一起的,有什么不能理解的。
2.这个不扯了,你那样认为就那样认为,我没意见。
3.PAE是36针地址线扩展而不是一般的MM内存映射。对于没有PAE的硬件系统难道就没有内存管理了?32位平台,没有映射就引发分页映射,一分页映射就是4KB固定的,什么实际没有多少?


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 首页 上一页 1 2
  • 22回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示