首页 > 编程语言 >04-【编写loader工程内容】利用内联汇编显示字符串

04-【编写loader工程内容】利用内联汇编显示字符串

时间:2024-07-23 17:11:08浏览次数:16  
标签:汇编 const 常量 04 loader 编译器 内联


在开发操作系统过程中,有时必须使用某些特殊的指令(如inb/outb/hlt),而C编译器无法自动使用这些指令。
因此,如果要使用这些指令,有两种方式:

  • 1.在汇编文件中为该指令的使用创建汇编函数(子程序),然后在C代码中以函数调用的方式去使用;

  • 2.使用内联汇编:即在C代码中嵌入汇编程序

在大多数情况下,使用内联汇编会更加简单、易用。因此,这里用GCC内联汇编的写法。


内联汇编格式参考链接:https://www.cnblogs.com/shuijiaoa/p/16060156.html


一些说明


(1)const 关键字

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变.

与预编译指令相比,const修饰符有以下的优点:

1、预编译指令只是对值进行简单的替换,不能进行类型检查

2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性

3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

参考链接:https://blog.csdn.net/xingjiarong/article/details/47282255


(2)函数参数为常量的好处

函数的参数,‌如果定义为常量,
‌意味着在函数内部对该参数的任何尝试修改都应该被禁止,‌以保持其值的稳定性。
‌这种设计有助于确保函数的行为可预测,‌避免因参数值变化导致的意外结果。


(3)函数参数为常量时,调用函数仍然能改变参数值

C语言的“常量”指的是字面值常量,例如const int a = 10;中的10。而a称为常变量,它本质上是一个不能改变的变量。
这种不能改变的特性是语法层面的编译器通过语法检查来确保a没有在代码中被修改过。
在运行时没有任何机制确保a不被修改,它就和任何普通变量一样

链接:https://www.zhihu.com/question/372226898/answer/1018899469


(4)在C语言中\n 和 \r 区别

  • \n:‌代表换行符(‌newline)‌,‌其主要作用是将光标移动到下一行的开头。‌在C语言编程中,‌\n用于输出文本时,‌会在当前位置插入一个换行符,‌使得接下来的文本从下一行的开头开始输出。‌

  • \r:‌代表回车符(‌carriage return)‌,‌其主要作用是将光标移动到当前行的开头。‌在C语言中,‌\r用于输出文本时,‌会在当前位置插入一个回车符,‌使得光标回到当前行的开头,‌而不是换行。‌




实操(编写loader_entry函数中的显示字符串的功能)


loader_16.c

__asm__(".code16gcc");

//显示字符串的函数
static void show_msg(const char * msg){
    //循环的读取字符
    char c;
    while( (c = *msg++) != '\0' ){  //*(解引用运算符)的优先级比 ++(自增运算符)的优先级高
        	asm(
                "mov $0xe , %%ah\n\t" //寄存器要加两个%符号
                "mov %[ch] , %%al\n\t"
                "int $0x10"::[ch]"r"(c)  //r代表任意寄存器,把ch字符存入任意寄存器中,并将c映射到该寄存器中
            );	          
    } 
}

void loader_entry(void){
    show_msg("....loading....\n\r"); 
    for(;;){} 
} 


编译运行调试后:


为了避免编译器优化代码,可以加上volatile关键字:








标签:汇编,const,常量,04,loader,编译器,内联
From: https://www.cnblogs.com/kakafa/p/18318975

相关文章

  • # 代码随想录算法训练营第38天 | 01背包问题:1049.最后一块石头的重量II(最多能装多少)、
    1049.最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/代码随想录https://programmercarl.com/1049.最后一块石头的重量II.html#算法公开课494.目标和https://leetcode.cn/problems/target-sum/description/代码随想录https://programmercarl.com......
  • P10480 可达性统计(拓扑,bitset 优化)
    link从数的角度来看,如果知道任意一个点能到达的点的数量,那么它的前驱节点一定也能到达,但是,只累加数的话无法处理可能存在重合点的情况。所以,考虑从集合的角度,设\(f(x)\)表示\(x\)能到达的点的集合如果\(x\)有邻点\(y_1,y_2,...,y_k\),那么\(x\)能到达的点就是它的邻点......
  • P4047 [JSOI2010] 部落划分
    原题链接题解一步一步来,当\(k=2\)的时候,怎么分?当\(k=2\)时,两个点集之间的距离等于两个点集中各取一个点之间的最小距离,我们联想到最小生成树的建立过程,按边权从小到大依次加入,如果两个点所属集合不同便合并因此,当\(k=2\)的时候,答案是最小生成树的最后一个合并边(树边)可......
  • 730475-D-ELEMENTS-F2 脉冲控制卡件模块 可以确保设备的稳定和准确控制
    730475-D-ELEMENTS-F2脉冲控制卡件模块是用于产生PWM(脉冲宽度调制)脉冲信号的模块,它可以调节脉冲的频率和占空比,从而实现对各种设备的精确控制。例如,它可以用于控制高压静电发生器、直流电机、LED调光等设备。这种模块通常具有可调的触发延时、断开断电、循环定时和延时开关......
  • Ubuntu18.04 安装 Cuckoo Sandbox (第三部分 安装沙盒遇到部分问题)
    Ubuntu18.04安装CuckooSandbox(第三部分安装沙盒遇到部分问题)0x00遇到的相关问题我们将一个二进制可执行文件传入cucko沙盒进行测试,如果安装正常,可以看到vitrualbox中win7执行该程序实现的效果。同时左侧的behavioralanalysis可以看到行为分析,但是一开始没有安装......
  • 2048小游戏【C语言版】单文件编写
    设计思路游戏地图和初始设置:使用一个4x4的二维数组map来表示游戏地图。初始时,所有位置的值均为0。score记录玩家得分,move_num记录移动次数。随机生成数字:在地图上随机选择一个空位置生成2或4。只有在地图发生变化时才会生成新数字。游戏菜单:使用m......
  • vmware 17.5安装ubuntu24.04-server版本
    下载地址官网GetUbuntu|Download|Ubuntu清华源清华大学开源软件镜像站|TsinghuaOpenSourceMirror中科大源http://mirrors.ustc.edu.cn/ubuntu-releases/阿里云开源镜像站http://mirrors.aliyun.com/ubuntu-releases/兰州大学开源镜像站http://mirro......
  • cs04 浅谈编译和链接
    C/C++语言中编译和链接通常都是自动完成的,win上VS全部包圆了,什么都不用操心,linux上使用cmake编写CMakeLists.txt也可以使用短短几行代码构建一个工程。那么编译和链接到底在我们看不到的地方做了什么呢?深入理解计算机系统中有一句话大多数编译系统提供了编译器驱动程序(com......
  • Ubuntu24.04安装
    1.系统安装1.1引导界面开机进入grub引导界面后,会有安装服务和测试内存两个选择,选择第一个进行安装。1.2语言选择这里的语言选择的是安装过程中的语言,根据个人偏好选择即可,不过没有中文,所以默认使用英文就好。1.3键盘配置默认选择的是English,可以在键盘布局(Layou......
  • 深入理解 Java 类加载机制:Arthas classloader 命令解析
    引言Java虚拟机(JVM)的类加载机制是Java应用运行的基础。了解类加载器(ClassLoader)的工作原理对于解决类冲突、热部署、资源查找等问题至关重要。Arthas,作为一个强大的Java诊断工具,提供了classloader命令,帮助开发者深入理解JVM的类加载机制。本文将详细介绍classloa......