关于上一节,我测试了发现3e、4c、4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了。 50不会输出HelloWorld,可能须要hex偶数且在0x3e~4f区间吧。上节复制并运行命令以下:html
View Codecopy /y helloos-Copy.img ..\z_tools\qemu\fdimage0.bin && ..\z_tools\make.exe -C ../z_tools/qemu
先无论上一节了,这节咱们写HelloWorld数组
看不清请右击“重新窗口打开图片”,下为P29 P39两页对照app
MOV就是赋值,没什么难的。因此咱们用P39来研究,方便一点。ide
既然C语言是顺序结构,那汇编就更是了(事实上的确是),因此咱们先挑后面容易的打印字符部分来看函数
H、L是寄存器高低位,高位0x0e为当前光标处显示字符功能,低位为字符内容(这里经过把数组每一个元素赋值给加法寄存器低位)oop
这一段是这么执行的(C语言的标签):entry => putloop(循环n次) => fin(无限次循环)post
goto 就是跳转到标签所在位置,并从标签开始往下执行。如测试
int i = 0; try: printf("%s", "Hello"); i--; go: printf("%s", "World"); to: if (i < 0) goto try;
这个会执行try => go => to,再跳转到try,从新try go to这样顺序执行下来。(直到i<0才中止)字体
再看msg标签部分url
按照ASCII码表,这个msg明显就是"\n\nhello, world\n\0"嘛,'\0'是字符串结束符 (NUL),'\0a'是换行符'\n'(LF)
关于HLT,总之就是暂停并等下一次操做。这里是为了节省cpu资源
该汇编指令是处理器“暂停”指令。“暂停” HaLT,没有操做数[1]功能:使程序中止运行,处理器进入暂停状态,不执行任何操做,不影响标志。当复位(外语:RESET)线上有复位信号、CPU响应非屏蔽中断、CPU响应可屏蔽中断3种状况之一时,CPU脱离暂停状态,执行HLT的下一条指令。
那个输出字符到屏幕的功能是这样实现的:
这里有一个的INT 0x10是一个叫BIOS中断的东西,参考: BIOS 中断向量表 和 BIOS中断大全
看了一下,从我开始找操做系统相关的资料到如今,基本上有用的全面的资料都能在维基百科里找到...没有科学就绝望了
做者说没法显示字体颜色,应该就是这个缘由吧?
研究完了打印部分,咱们来看最主要的部分,给寄存器赋值部分
AX = 0
而后注意,SS = AX是把AX的值赋给SS,AX的值是数值0 但并非地址。因此这一列就只是将AX SS DS ES都初始化为0,
而SP = 0X7C00 和 SI = msg 才是这部分的重点
因此咱们得找一下 栈指针和源变址 两个寄存器的做用
这么多寄存器,咱们得找一下他们的做用:
寄存器速记(第二个字母)
S | segment | 段寄存器 |
X | 基于八的extend | 16位寄存器 |
P | pointer | 指针寄存器 |
寄存器名(省略寄存器三字):
AX 加法(add)
SS 栈段(Stack segment)
SP 栈指针
DS 数据段
ES 附加段(extra)
我猜:
SP栈指针 指向整个程序/操做系统开始的地方
SI存放msg标签的数据,即"\n\nhello, world\n\0",而后由以后的程序把SI所存的地址值不断+1并不断赋值给AL(这个寄存器存放着须要中断变量/函数INT 10要打印的字节),相似于c语言的data = a[++i],而且判断AL == 0成立时跳出循环,以此实如今屏幕上打印HelloWorld的功能
事实上:
也就是说标签名表明了标签所在地址
大概就是这样了,具体看书里的便可
重要参考资料: