计算机启动的细节与汇编Demo的拆解1

电子说

1.3w人已加入

描述

本文汇编程序是X86环境下的,移植其他平台可能产生错误。

一、汇编Demo解析

在前面的文章中建立了一个简单的汇编Demo,令虚拟机输出一个“Helloworld!”字符串。

org 0x7c00     ;程序起始位07c00h

此处的org是Origin的缩写,意为起源位置、起始位置。

在此前不管是桌面还是移动端,甚至是嵌入式系统的开发,工程师都是使用如C,C++,Java等类似的高级语言;而撰写好程序源文件后剩下的事情便交由编译器去做。

类似于程序运行需要多少内存空间,分配多少时钟周期,程序加载位置与栈内存等琐碎的问题,我们却不太关心。这些操作都由编译器根据工程要求进行分配。

如果使用Windows环境,我们通过属性可以获取我们电脑简单参数。如:处理器,系统版本之类的。

在其中我们必然会看到这样一行:机带RAM。其实这就是通常所说的运行内存,简称:内存。(我的机器内存8G)

汇编

我们的程序编译好后是存放在硬盘中的。如果没有启用,它与其他千千万万个文件表现形式一样,也没办法区分。

如果我们唤起该程序便会产生差异。

首先CPU向硬盘发送查询命令,在硬盘中找寻该程序机器码,在获知该文件存在后硬盘向CPU报告找寻文件就绪;其次CPU向硬盘发送将该程序机器码拷贝到运行内存(硬盘太慢);内存就绪后CPU使用IP寄存器指向该地址并步进执行。

Org作用出现在第二步,硬盘将程序复制到内存哪个位置呢?org如是说:到0x7c00处!于是便复制到此。

简单来说org命令就是标志程序加载位置的,此前我们进行的程序设计没有做过这类工作完全归功于编译器的功劳。

为什么是0x7c00处呢?深究起来也并无其他高深道理,不过是为保持兼容性,硬件厂商共同约定的事情而已。但是如系统开发不遵循这样的约定却又无法正常启动。毕竟如果所有厂商都遵循的约定就会成为行业规范。

(我下一步计划设计一个RISV指令集的CPU,到时我将不遵循这个约定。那真是海阔凭鱼跃,天高任鸟飞)

在我们学习汇编写操作系统的过程中还会有其他耐人寻味的约定,当有所涉及再进行介绍。

mov ax,cs
mov ds,ax
mov es,ax

从前面的介绍可知:

AX是通用寄存器,在此例中用来做数据拷贝。

CS是代码段寄存器,用来存储该段代码的入口地址。

ES的附加段寄存器,存放当前执行程序中一个辅助数据段的段地址。

DS是数据段寄存器,在此用于标示数据段其实地址。

X86架构计算机在实模式下寻址方式是:段+偏移。而这涉及到绝对地址和逻辑地址概念,这是以后的内容,再此我们先简单记住这三行是确保三个寄存器指向同一地址,以便后续进行数据操作能定位到正确位置。

这种操作可以总结为“寄存器对齐”。

call DispStr

Call是汇编语言中进行函数调用的助记符,该行意义是跳转到名为DispStr的位置并继续执行。

call DispStr
mov ax,BootMessage
mov  bp,ax                ;串地址
mov  cx,11                ;串长度
mov  ax,01301h        ;AH = 13,AL = 01h
mov  bx,000ah         ;黑底绿字
mov dl,0
int  10h                ;10h号中断
ret

上述便是DispStr主体,在程序末位我们使用BootMessage替代"Helloworld!"字符串,此时BootMessage为存储Helloworld!内存的首地址。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分