MacOS环境-手写操作系统-45-C语言开发应用程序

简介: MacOS环境-手写操作系统-45-C语言开发应用程序

C语言开发应用程序

1.简介

前边跳了几节 一个是内容比较细碎 另一个是原老师的文章链接挂掉了


我也不太好做笔记 所以就跳过去啦 中间修复了一些bug和加了一些功能


也不是那么重要 所以就忽略啦


我们的操作系统通过增添内核接口导出机制后


已经可以作为平台 运行应用程序了


但目前应用程序的开发有一个不足就是


我们只能使用汇编语言开发应用程序 用汇编语言开发程序实在太累了


如果能使用C语言就好了

例如当我们想要开发一个在控制台上输出一个字符的应用程序


如果代码能用C语言这么写就好了(app.c):


void api_putchar(int c);
void main() {
    api_putchar('C');
    return;
}


如果上面的代码能编译成二进制文件 并能通过系统加载执行


那么在我们的操作系统上开发应用程序就不必要像以前那么痛苦


我们这一节要做的是 研究如何使用C语言开发运行在我们系统之上的应用程序


2.代码

实际上 我们用C语言开发内核的步骤 可以平移到开发应用程序上


我们开发内核时 实际上遵循着的基本逻辑是这样的


用汇编开发底层接口 然后用C语言调用汇编语言导出的接口 实现业务逻辑


然后把C代码编译成二进制文件


接着使用objconv 工具把C语言反编译成汇编语言


下一步就是把原来的用汇编开发的代码跟反编译后得到的汇编代码合二为一


最后用汇编编译器把整合起来的汇编代码编译成一个统一的二进制可执行文件


我们用C语言开发应用程序也遵循上面的逻辑


首先我们用汇编语言导出内核API接口


用C语言调用汇编语言导出的接口完成业务逻辑的编写


接着把C语言代码编译成二进制 再使用objconv反汇编


最后把两个汇编语言代码合二为一 统一编译成一个可执行的二进制文件


基于上面的逻辑步骤


我们第一步要做的就是用汇编语言导出api_putchar函数调用的接口


实现代码如下api_call.asm


[SECTION .s32]
BITS 32
call main
retf
api_putchar:
  mov edx, 1
  mov al, [esp + 4]
  int 02Dh
  ret
%include "app.asm"


我们先看api_putchar部分


前面我们讲过 内核所有api都对应一个编号 向控制台输出一个字符的api编号就是1


要调用对应api时 只要把对应编号放入寄存器edx


同时把参数提交给指定寄存器 最后调用2D号中断就可以了


在代码的前面


我们首先执行语句call main


也就直接调用main函数 这意味着用C语言开发程序时 主入口函数必须是main


所有C语言开发的程序代码编译成二进制文件后 然后反汇编成汇编程序


反汇编后的程序文件就是app.asm


通过include指令把app.asm的代码整合到api_call.asm中来


最后使用汇编编译器nasm 编译 api_call.asm 所得到的二进制文件就是用C语言开发的应用程序


3.编译和运行

编译运行后(注意makefile更新了)


运行后


切换焦点 输入hlt运行程序


打印了如下的结果


相关文章
|
13小时前
|
Ubuntu Java iOS开发
MacOS环境-手写操作系统-00-开篇 简单成品介绍
MacOS环境-手写操作系统-00-开篇 简单成品介绍
20 14
|
13小时前
|
Ubuntu Java C语言
MacOS环境-手写操作系统-07-C语言绘制系统界面
MacOS环境-手写操作系统-07-C语言绘制系统界面
6 1
|
10小时前
|
存储 API C语言
MacOS环境-手写操作系统-46,47-C语言开发应用程序
MacOS环境-手写操作系统-46,47-C语言开发应用程序
8 0
|
5月前
|
运维 开发工具 C语言
手写操作系统(1)——HelloOS
手写操作系统(1)——HelloOS
140 3
|
10小时前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
7 0
|
11小时前
|
Ubuntu Java iOS开发
MacOS环境-手写操作系统-19-编译自动化
MacOS环境-手写操作系统-19-编译自动化
6 0
|
13小时前
|
Java iOS开发 C++
MacOS环境-手写操作系统-03-突破512字节的限制
MacOS环境-手写操作系统-03-突破512字节的限制
5 0
|
12小时前
|
存储 算法 C语言
MacOS环境-手写操作系统-17-内存管理算法实现
MacOS环境-手写操作系统-17-内存管理算法实现
8 0
|
13小时前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
5 0
|
12小时前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-11-建立中断机制
本文详细介绍了如何为内核建立中断机制,涉及8259A中断控制器的初始化、中断信号的传递过程以及中断描述符表的设置。通过汇编和C语言代码展示了如何处理中断,特别是键盘和鼠标中断,最后给出了编译和运行的步骤。 摘要由CSDN通过智能技术生成
7 0