前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >写一个操作系统_09 C语言和汇编语言

写一个操作系统_09 C语言和汇编语言

作者头像
changan
发布2020-11-04 15:01:01
9690
发布2020-11-04 15:01:01
举报
文章被收录于专栏:巡天遥看一千河
函数调用约定

编译器一般使用堆栈实现函数调用,每个进程都有自己的栈,用栈来传递参数,会带来以下问题:

  • 参数存储在栈中,那么谁来负责回收参数所占的栈空间,是调用者?还是被调用者
  • 当参数很多的时候后,主调函数将参数以什么样的顺序传递

高级语言有调用的约定:

举例:

代码语言:javascript
复制
int sub(int a , int b){ // 被调
    return a-b;
}
int s = sub(3,2);       // 调用

调用:
push 2
push 3
call sub

被调:
push ebp
mov ebp,esp
mov eax,[ebp+8]
sub eax,[ebp+12]
pop ebp         // 恢复 ebp
C & ASM 混合

C和汇编混合编程有两种方式:

  • 用汇编和C单独写单独编译,然后链接在一起
  • C代码嵌入汇编

C代码嵌入汇编:

代码语言:javascript
复制
char* str = "C & ASM Code\n";
int count = 0;
int main()
{
    asm("pusha;\
            movl $4,%eax;\
            movl $1,%ebx;\
            movl str,%ecx;\
            movl $13,%edx;\
            int $0x80;\
            movl %eax,count;\
            popa;\
            ");
}
// gcc -m32 casm.c
内联汇编及其扩展

上面的例子是内联汇编的一个例子,基本的内敛汇编功能比较薄弱,在此基础上,GCC添加了扩展功能,在C语言里面用扩展汇编真的不舒服,相当于多了一种语言,需要依据其规则。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数调用约定
  • C & ASM 混合
  • 内联汇编及其扩展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档