作者GTFX (我达达的马蹄~)
看板ASM
标题Re: [问题] 请问malloc, calloc这类c语言在assembl …
时间Sun Jul 27 16:03:29 2008
※ 引述《king19880326 (OK的啦~我都可以接受)》之铭言:
: 这学期学了组语
: 在课堂上老师解释的时候
: 时常会拿c语言跟组语之间的转换来给我们作为比较
: 可是我最近在写的时候突然发现
: 如果说, 一个c程式对於变数的静态宣告
: ex. int a = 5
: 其实就是在组语程式的最前面, 先给了一块变数位址
: 那动态的呢(ex. malloc, calloc)??
: 翻了整本教科书, 实在想不到什麽组语的指令可以做到这件事 OTZ
这个问题的答案有点复杂
可以直接回答 没有指令可以做到分配动态记忆体空间这件事 XD
怎麽说呢 请听我细细道来
在我们写了一个程式之後 我们会把这个程式编译成一个执行档
比如说一个elf档 这个elf档里面会有一些资讯告诉我们一些事情
像是entry point(程式开始执行的位址) 还有stack pointer跟heap的起始位址
还有bss跟一些有的没的的讯息
我们开始执行程式之後 OS就会把它load到记忆体里面 然後会根据上面讲的那些讯息
作一些处理
而我们在程式中 如果呼叫了一个malloc函式 这个函式就会去呼叫底层的system call
发system call去做这件事 以glibc的做法好像是 如果空间不太大就呼叫sbrk的
system call 如果空间太大就呼叫mmap的system call 然後OS 会根据这些system call
去分配一块记忆体空间给这个程式 如果是malloc这种动态要的 就会分配在 heap指的
位址下面 这块空间OS会帮你的程式管理避免其他程式再用到同一块位址
然後你的程式就可以使用这个位址了 大致上就是这样 结果说了老半天还是没说到
组语会做什麽事 组语其实就是会去设定heap的位址这样而已 把heap的位址设出来
就可以用了
以上讲的都是有OS并使用glibc的作法
如果是在没有OS的情况下要malloc记忆体 使用的是newlib的话
newlib就不会去帮你管理记忆体空间了 记忆体空间 会是你怎麽要就可以怎麽用
管理记忆体空间这件事就要程式自己去做了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.223.44
1F:推 anr2:推!! 08/01 12:48