操作系统的自我修养-03-"Hello,World横空出世"

NASM 与 GCC 混合编程:Windows 平台汇编与 C 语言联合开发指南 本文详细介绍了在Windows平台上使用NASM汇编器与GCC编译器进行混合编程的完整指南。内容涵盖环境配置、32位与64位调用约定差异、参数传递规则、栈帧管理以及实战案例,旨在帮助开发者高效整合C语言的高效开发与汇编语言的底层控制能力,实现性能优化。 阅读详情

作者:K_Linux_Man   转载请注明出处

 

     无论是汇编语言,还是C语言第一个程序都是输出“Hello, World”,但是我们在制作操作系统之前一定要给自己的操作系统起一个了不起的名字。

而我给它命名为“MerxOs”.

     让我们的MerxOs操作系统在开机的时候能够显示“Hello,World”是我们接下来要做的事情,然后我们必须要知道如何让屏幕去显示字符,这个看起来简单的问题。

 

BIOS中断---显示字符

在BIOS中断里,int 10中断是显示中断。在10号中断里有很多功能,我们即将要使用显示字符到屏幕的功能去实现我们的引导扇区程序显示“Hello,World”字符串。

 

int 10中断 显示字符功能

寄存器             赋值                                                      描述         
   AH            0x0E               给AL赋值0x0E代表使用显示字符功能
   AL            字符                         将字符赋值于AL
   BH           页码值                       BH=0x0 代表当前页
   BL       显示的属性            0xF 代表 黑底,白字 (0000 1111)

引导扇区格式

BIOS不是随便就去加载一个扇区的,所以引导扇区必然有规定的格式。这个扇区必须在第一个扇区的位置,并且以55AA结尾。所以,我们写完引导扇区后,

要填充0直至510字节,然后填充55AA。前面我们讲过这个扇区会被加载到7c00h的位置去执行,所以引导扇区程序的第一行代码是org 0x7c00h。

 

引导扇区程序的编写

编写代码我使用NotePad++

将语言调整到Assembly格式,以下截图

 

 512K的引导程序代码如下:

	org 0x7c00

	mov ax,cs
	mov ds,ax
	mov es,ax
	
	mov si,String
	
	call ShowString
	
	jmp $

String: db 'MerxOs: Hello, World!',0
	
ShowString:
	mov ah,0x0E
	mov al,[si]
	inc si     ; mov al,[si] 和 inc si 可以用一条指令完成。lodsb
	or  al,al
	jz  .end
	mov bh,0x00
	mov bl,0x0F
	int 10h
	jmp ShowString
	
	
.end:
	ret



times 510-($-$$) db 0;(剩余代码填充0)当前汇编地址减去起始地址=代码段的数据长度,512减去代码段长度等于剩余代码长度
db 0x55
db 0xAA
	
	

 

 

引导程序的实施

nasm编译汇编代码

找到nasm安装的根路径,默认在C:\cygwin。这个目录下是模拟linux下的目录,我们在home\administrator(以自己计算机名称命名的文件夹,根据自己的计算机名,

有不同的命名)目录下新建一个文件夹,命名为:first_code。将我们的汇编代码保存到first_code目录下,并命名为boot.asm

打开 cygwin之后,ls查看一下咱们刚才新建的文件夹first_code,再进入查看一下咱们的引导程序代码boot.asm

接下来我们要用nasm编译器编译我们的boot.asm 引导程序,并命名为boot.img

命令为: nasm   boot.asm   -o  boot.img

我们已经成功的生成了引导程序的镜像文件。接下来我们要将此镜像文件以软盘镜像的文件类型让bochs加载并显示处我们的"MerxOs:Hello,World!"内容

 

Bochs运行软盘镜像

到bochs的根目录下,默认安装路径为C:\Program Files\Bochs-2.5

找到dlinux文件夹,复制一份并修改成咱们自己的操作系统名称:MerxOs

修改MersOs 文件夹下 run.bat  和  bochsrc.bxrc 的内容。

run.bat 是一个批处理文件,而bochsrc.bxrc是bochs的配置文件。

run.bat 只要修改一下路径就可以了。将 "C:\Program Files\Bochs-2.5\dlxlinux" 修改为"C:\Program Files\Bochs-2.5\MerxOs"

 

bochsrc.bxrc 修改的地方也不多。

1.将floppya.img 修改成咱们自己生成的boot.img名字。

2.将硬盘主分区那行用#注释掉,意思是不从硬盘加载MBR。

3.改为boot:a  从软盘启动

 

将我们生成的boot.img 文件拷贝到MerxOs 文件夹中,运行run.bat即可。

 

运行结果:

 


Bochs 强大的调试功能

在MerxOs 文件夹中是没有bochsdbg.exe(bochs的debug程序).它是从上一级目录考取过来的。

双击运行bochsdbg.exe,即可进入debug调试模式。

点击strat,即选择从默认的bochsrc.bxrc配置文件开始调试。

 

在0x7c00处加入一个断点,然后继续执行到0x7c00处停止。

 

 

 

 

逐条执行代码: Step 1 或 s 1

反汇编10行代码:u/10

查看寄存器内容:reg

查看段寄存器内容:sreg

继续执行: continue 或 c

 



引导程序代码的解释:

ORG 0x7c00的作用

org 0x7c00 是告诉编译器将程序加载到内存的什么位置。你可能有一个疑问? “BIOS不是将引导程序主动加载到内存地址为0x7c00的地方吗,

干嘛还要在汇编程序告诉编译器加载地址呢?!”我一开始的时候就没有加org这行代码,不信的话你注释掉这行代码再去运行的话,不会显示

咱们要的内容。这是为什么呢?通过bochs调试功能可以看出(接下来会有怎么用bochs调试代码的内容)。


关键在于运行到mov si, String 这样代码的时候。加上org 0x7c00的时候,直接将String翻译成0x7c0e,String本应该是相对这段程序开始的偏移量。加上org 0x7c00的话,

String的地址(0x7c0e)是由0x7c00和相对于这段程序的偏移量(0xe)相加而得.



如果不加 org 0x7c00的话,String会被翻译成相对于程序开始的偏移地址 0xf,为什么不是0xe呢? 这是因为 mov ax, 0x7c0,翻译成机器语言是三个字节,相比原先代码中mov ax,cs 是两个字节,所以String地址变成了0xf.



当程序运行到 mov al,ds:[si] ,也就是说si是数据段寄存器的偏移值才得到咱们定义的字符串“Hello,World”,而ds的内容是什么呢?等于cs的内容,

而cs的内容是0x00。所以mov al,0000:[si] 是相对0x00开始的si偏移,而那里根本不是我们存放字符串的地址。正确的地址是相对0x7c0偏移si的地址.

不过,即使你不加org 0x7c00这个地址,而主动告诉ds数据段寄存器应该存放0x7c0地址,也是可以的,而代码段cs寄存器内容还是0x00.只是数据段寄存器变为0x7c0了。(0x7c0:si)所以,如下代码也能达到相同效果。这里必须说明

一下,ds赋值的内容是0x7c0,而不是0x7c00。原因是由于寻址方式,内存地址=段*16+偏移地址,所以是0x7c0,段寄存器需左移一位+偏移地址。

     	;org 0x7c00

   	mov ax, 0x7C0 ; 地址=段*16+偏移的定义,所以是0x7c0,而不是0x7c00,段寄存器需左移一位

   	mov ds, ax
	mov es, ax

	
	mov si,String
	
	call ShowString
	
	jmp $

String: db 'MerxOs: Hello, World!',0
	
ShowString:

	mov ah,0x0E
	mov al,[si]
	inc si
	or  al,al
	jz  .end
	mov bh,0x00
	mov bl,0x0F
	int 10h
	jmp ShowString
	
	
.end:
	ret


times 510-($-$$) db 0;(剩余代码填充0)当前汇编地址减去起始地址=代码段的数据长度,512减去代码段长度等于剩余代码长度
db 0x55
db 0xAA
	
	


定义字符串

String: db 'MerxOs: Hello, World!',0 这里是单引号,最后以0结尾,在内存中定义了一个以0结尾的字符串。String代表字符串相对于该程序的起始偏移地址

其他

对字符串中每个字符依次显示,直到遇到0为止结束循环。这里说明一下 mov al,[si]  是将si这个地址里存放的内容赋值给al

最后, $$代表这段代码进行汇编时的起始地址,而$是当前被编译代码的地址,他们两个的差值,正好是代码的大小。而我们要做的是

将最后两个字节赋值为0x55和0xAA,而其余的全部填充为0.

 

 

 

 

执行控制指令

c/cont/continue连续执行
s/step/stepi [count]执行count条指令,默认为1条,会跟进到函数和中断调用的内部
p/n/next [count]执行count条指令,默认为1条,但跳过函数和中断调用
Ctrl+C停止执行,并回到命令行提示符下
q/quit/exit退出调试和执行

断点设置命令

vb/vbreak seg:offset在虚拟地址上设置指令断点,其中seg和offset可以是以0x开始的十六进制数,或十进制,或者是以0开头的八进制数
lb/lbreak addr在线性地址上设置断点,addr同上面的seg和offset
b/break/pb/pbreak addr在物理地址上设置断点
info break显示当前所有断点的信息
d/del/delete n删除一个断点

内存操作指令

x /nuf addr检查位于线性地址addr处的内存内容
xp /nuf addr检查位于物理地址addr处的内存内容

其中参数n、u、f分别表示:

n为要显示内存单元的计数值,默认为1

u表示单元大小,默认值为w


b(bytes) 1字节
   h(halfwords) 2字节
   w(words) 4字节
   g(giantwords) 8字节


f为显示格式,默认为x
   x(hex)         显示为十六进制数
   d(decimal)   显示为十进制数
   u(unsigned)    显示为无符号十进制数
   o(octal)   显示为八进制数
   t(binary)   显示为二进制数
   c(char)     显示为对应的字符

信息显示命令

r/reg/regs/registers列表显示CPU寄存器及其内容
set $reg=val修改某寄存器的内容。除段寄存器和标志寄存器以外的寄存器都可以修改,如set $eax=0x01234567
creg列出所有的CR0-CR4寄存器
sreg列出CPU全部状态信息,包括各个段选择子(cs,ds等)以及ldtr和gdtr等。
print-stack打印堆栈情况。
info tab显示页表

 

反汇编命令

                u/disasm/disassemble start end,反汇编给定线性地址范围的指令。也可以是u /10 反汇编从当前地址开始的10条指令。

 

 

 

 

 

 

 

 

 

 

linux 0.11 bochs2.6.9配置文件 linux 0.11 bochs2.6.9配置文件,针对linux 0.11 在bochs2.6.9上的配置文件,带注释 立即下载

相关推荐

bochsrc-hd.bxrc

自己根据bochs2.6.x文档,运行linux0.11版本

自制操作系统——01(Hello,world!)

boot.asm 程序代码:org 0x7c00;加载本程序至内存0x7c00处,如果省略,那么标号后面必须手动加上0x7c00 mov bp,szBuffer;将标号地址赋值给bp mov ah,0x0e;显示字符(ah值的选择可参考BIOS int 10h参数表) mov cx,12;这里显示12个字符 mov bx,0h;初始化计数器bx为0 print_str: mov bp,szBuffe

keyboard not found! Please press F1 to continue. 558

bochsrc

bochsrc,bochs的配置文件,请注意里面的$BXSHARE是你安装的Bochs文件夹,它的下面有配置中的文件。(也是实验课里下载的哈哈哈)遇到一些错误在我博客搜搜看能不能解决

【Bochs】 如何传递文件到Dos系统中

Bochs上传输文件到DOS系统

u012329294的专栏 1277

DC竞赛 国能日新功率预测题 rank21 解决方案(适合新手)

DataCastle国能日新光伏功率预测 数据异常处 本题在测试集中提供了时间、辐照度、风速、风向、温度、压强、湿度、实发辐照度8个特征,以及标签**实际功率**。 而在训练集中只有前七个特征,无实发辐照度。 策略 在观察了数据之后,我们确定实发辐照度是一个强力特征,于是我们采取了stacking的策略: 1. 第一次训练以实发辐照度为标签,预测 测试集的实发辐照度 2....

yyhhlancelot的博客 7294

实战指南:UOS专业版命令行高效下载离线安装包及依赖

本文提供了一份UOS专业版离线安装包的实战下载指南。针对无外网环境下的软件部署难题,详细介绍了如何通过命令行精准获取软件包名,并利用`apt download`命令高效下载主程序及其所有依赖。文章重点解析了使用`apt install --dry-run`模拟安装来完整获取依赖包的方法,并给出了离线安装、问题排查及自动化脚本编写等高级技巧,帮助管理员和运维人员实现可靠的批量离线部署。

honey的博客 1109

操作系统:Bochs 2.6.8的配置文件bochsrc.bxrc修改

由于现在Bochs 2.6.8相比之前有些改动,之前的配置文件不能直接运行,针对配置文件需要有些修改。 ROM: System BIOS must end at 0xfffff keyboard_mapping' is deprecated - use 'keyboard' option instead keyboard directive malformed vgaromimage directive malformed

枫竹梦 2万+

100道测试工程师笔试的Linux笔试题及答案_网络安全工程师关于linux的笔试大题

47.Linux系统中,一般把命令 ls 定义为 ls --color 的别名,以便以不同颜色来标识不同类型的文件。但是,如何能够使用原先的ls命令?83.在xdm的配置目录中,哪个文件用来设置在用户通过xdm登录后自动起动的应用程序?45.你的系统使用增量备份策略,当需要恢复系统时,你需要按什么顺序恢复备份数据?84.命令 netstat -a 停了很长时间没有响应,这可能是哪里的问题?51.Linux中,提供TCP/IP包过滤功能的软件叫什么?88.TCP/IP中,哪个协议是用来进行IP自动分配的?

2401_84247760的博客 1054

Bochs 总结篇

制作 img 映像文件 不管是硬盘hd还是软盘fd,统一使用如下步骤: 1、在当前目录打开 cmd 2、执行 bximage 命令 3、然后按它的步骤创建 4、最后会在当前目录下生成的 img 文件 硬盘映像配置文件示例 文件名及后缀名:bochsrc.bxrc megs: 32 # filename of ROM images romimage: file=$BX...

Rand Tsui 841

从零开始用TS开发babylonjs - 本机环境搭建

babylonjs,初始化本地安装,web3d引擎

han3527638的专栏 793

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2740

新建bochsrc-new.bxrc配置文件

1.新建bochsout.txt 2.新建bochsrc-new.bxrc配置文件 romimage: file=$BXSHARE\BIOS-bochs-latest, address=0xf0000 megs: 32 vgaromimage: $BXSHARE\VGABIOS-elpin-2.40 floppya: 1_44="bootimage-0.11-fd.new", status=i

weiyuanzhuo的博客 1786

世界职业院校技能大赛—人工智能赛道项目逐字稿参考十二

世界职业院校技能大赛—人工智能赛道项目逐字稿参考十二

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 142

Summary Bochs bochsrc.bxrc Configure File

PLUGIN_CTRL: 控制PC设备插入哪些硬件选件。 #plugin_ctrl: unmapped=0, e1000=1 # unload 'unmapped' and load 'e1000' CONFIG_INTERFACE: 控制Bochs软件的控制界面。 #config_interface: textconfig #config_interface: win32config

liuer2004_82的专栏 722

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 4928

矩阵奇异值分解算法(SVD)的导数 / 灵敏度分析

设矩阵X∈Rm×nX∈Rm×nXUΣV⊤XUΣV⊤U∈Rm×mU∈Rm×m为左奇异向量矩阵;V∈Rn×nV∈Rn×n为右奇异向量矩阵;Σdiag⁡σ1σ2σrΣdiagσ1​σ2​σr​为奇异值对角阵(rrank⁡XrrankX我们关心:当XXX发生微小扰动dXdX时,UΣVUΣV如何变化?dXdUΣV⊤dX。

qq_36812406的博客 1750

bochsrc.bxrc

################################################################ bochsrc.bxrc file for Tinix.################################################################ how much memory the emulated machine will ...

587

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

bochsrc.bxrc的win7镜像配置文件

# configuration file generated by Bochs plugin_ctrl: unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, gameport=true config_interface: win32config display_library: win32 memory: host=2048, guest=2048 romimage: file="../

如鹿渴慕泉水的专栏 999

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MPSOC学习之HELLO WORLD

早就听闻XILINX 新一代 SOC,Zynq UltraScale+ MPSOC 系列性能强悍无比,号称相比ZYNQ 7000系列每瓦性能提升5倍,一直未能体验一把。直到近期因项目需要,入手了一套米尔的MPSOC开发板,才终于开启了MPSOC学习之路。废话不说,hello world先。 开发环境:vivado 2017.4,开发板型号:米尔MYD-CZU3EG, 主芯片XCZU3EG-1SFV...

bishen1574的博客 822

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

拼一个自己的操作系统(SnailOS 0.03的实现)

拼一个自己的操作系统(SnailOS 0.03的实现)

weixin_39410618的博客 690

【手写操作系统实战】01 - 安装Cygwin + bochs 环境

下载并安装: bochs https://sourceforge.net/projects/bochs/files/bochs/ 安装的时候,注意勾选 DLX Linux Demo,这样我们可以复制其中的 bochsrc.bxrc 以它为模板,来编写配置文件。 最简单的配置文件bochsrc.bxrc内容如下,配置成从软盘启动: # how much memory the emulated machine will have megs: 32 # filename of ROM images romim

|~~~热爱生活、努力学习的小伙汁~~~| 1683

bochsrc无法启用 bochs的配置问题

你要确认你当前在的目录下有bochsrc和。img文件在输入bochs 例如你吧bochsrc拷贝到一个temp文件下你利用cd到达这个文件在启用bochs既可

zhouyelihua 2111

a bochsrc option needs at least one parameter

Bochs is exiting with the following message: [ ] bochsrc.bxrc:1: a bochsrc option needs at least one parameter 错误原因: 文件的编码,从 UTF-8 换成 ANSI 就好了 不过之后换回 UTF-8 也可以运行了... bochs 配置文件 内容如下 #...

ZhuZhuDrinkMilk 3833

Bochs简介+使用

原文地址:http://www.netemu.cn/VirtualMachine/Bochs/20071028/347-1.html 1.1.1  Bochs vs. Virtual PC vs. VMware 不知道开源给你的感觉是什么,对笔者而言,它总是意味着亲切、清新,身上没有讨厌的商业气息。也许你也有同感,如果是的话,可能你已经对本书到现在才提到Bochs感到不满。实际

思考的智慧,知识源于思考 6002

调试Linux0.11,试验步骤总结(简化版)

本总结力求简化,目标能够自己创建linux0.11硬盘镜像、自己创建跟文件系统、替换内核文件,并成功调试。本总结参考陈博的clk-ch14-expriment.pdf,做了简化,便于windows下操作。详细的内容可以对照clk-ch14-expriment.pdf。步骤:1. 准备windows下实验环境: 安装vmware,在vmware上安装fedora;安装Bochs-2.1.1;

pengyang的专栏 2701

实现操作系统(1) Bochs的安装配置&最简单的“操作系统”

Bochs:为多平台设计的x86架构模拟器/虚拟机材料: 1、Ubuntu16.04LTS 2、Bochs-2.6.8一、安装步骤: 1、到官网上下载Bochs-2.6.8.tar.gz 下载链接下载源码而不直接使用sudo apt-get install vgabios bochs bochs-x bximage命令行安装是因为我们还要安装Bochs的调试功能2、解压下载好源码:tar zx

ByChen623的博客 1万+
上一篇: 操作系统的自我修养-02-玩你妹的“BIOS”
下一篇: 操作系统的自我修养-05 从实模式到保护模式的飞跃
karry_vcent
博客等级 码龄15年 93粉丝 45原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值