DIY微型操作系统(2)—— 寄存器赋值

书上已经为我们提供了最简单的“hello world”程序了

相信大家玩的也挺欢乐的,不过这只是引导扇区的雏形

而且如果找不到完整的光盘上的源代码,新手估计很难学的下去

所以之后文中也会尽量贴出代码

不过在继续开始之前,我们有另外意见很重要的事情要做:

让所有东西都在掌控之中!

如果你觉得觉得有几个特殊寄存器的值不知道怎么给,那么

接下来我们要看看怎么样随心所欲地给所有寄存器赋值


Intel x86系列寄存器与赋值方式 (存放到内存顺序:低地址对低地址)


32bit名称


16bit名称


注释


赋值方式


EAX


AX


accumulator


ECX


CX


counter


EDX


DX


data


EBX


BX


base


可以用来控制制定内存地址(变址):

MOV [SI],AX


EBP


BP


base pointer


ESI


SI


source index


EDI


DI


destination index


ESP


SP


stack pointer


EFLAGS


FLAGS


flags


不可以用MOV直接赋值


IP


instruction pointer


CS


code segment


DS


data segment


不能用MOV赋立即数

但可以通过AX等寄存器赋值


ES


extra segment


SS


stack segment


FS


segment part2


GS


segment part3


GDT


global description table


通过LGDT赋值


LDT


local description table


通过LLDT赋值


赋值方式补充


寄存器


赋值方式


DS,ES,SS,FS,GS


MOV AX,7C00H

MOV DS,AX


PUSH 和 POP 指令


IP


JMP


CALL


CS:IP


JMP 0x0001:0x0000


CALL


PUSH 和 RET 指令


(E)FLAGES


PUSHFD    ;push flags double-word

POP EAX

...

PUSH EAX

POPFD    ;pop flags double-world


GDT


LGDT


LDT


LLDT

一看这些,估计头都有点晕了吧

没关系,也不用一下子就记住,只要用的时候知道上哪里查找就可以了。在以后的开发过程中用着用着就记住了。

那么这次我们就到这里,可以在看书的时候稍微留意一下作者川合先生的代码是怎么赋值的,或许会有不少新收获。

转载本文请保留以下网址:http://www.cnblogs.com/warren-wong/p/3976042.html

如果发现文中有错误之处,请务必告诉我,谢谢大家。

时间: 2024-10-23 13:11:17

DIY微型操作系统(2)—— 寄存器赋值的相关文章

DIY微型操作系统(1)——开发的准备

这个连载是根据<30天自制操作系统>这本书所写 只是类似于补充之类的东西,要详细的讲解,还请参照书上的内容 所以,首先我们要感谢作者川合秀实先生!(鞠躬) 为什么我想写这么一个补充的? 因为这本书的所使用的软件,对于2014年来说,确实是有点旧了. 但是如果不用川合先生的那些方便的工具,开发会变得很麻烦. 所以,在开始之前就有一个大难题——用什么工具开发? 所以就有了这篇补充 这篇补充的目的是: 使用能在网上容易找到的软件来开发出操作系统. 我们不求完美,但只求最后能在U盘上插在现实的电脑上启

操作系统(3)实验相关原理——bootloader启动uCore

x86启动顺序 CS+EIP决定启动地址. CS部分后面又4个0,相当于是左移了4位.总之就是要让CS左移4位之后加上EIP来得到要跳转的地址. 0x7c00地方开始的512字节的内容就是bootloader.这么做的原因是BIOS只能加载一个扇区,所以只能通过bootloader来加载系统. 段机制 这边uCore没有实现段机制,因为可以通过页机制来很方便地实现. 但是还是绕不开段模式,只要启了保护模式段就enable了(而且页机制基于段基址实现),所以还是要建立好段机制.下面这种映射关系近似

【自制操作系统04】从实模式到保护模式

通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序.具体说就是 bios 通过加载并跳转到 0x7c00(IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mbr.asm,然后 mbr.asm 里做的事就是通过加载 loader 程序并跳转到 0x900(这个是我们自己定的)把控制权转交给了 loader.asm 程序,目前这个程序里还只是向屏幕输出一行字符串"loader",今天我们就将扩展它.并且今天我们要做的事,是操作系统中的第一个精彩之处

[自制简单操作系统] 6、多任务(一)

#前言# >_<" 这里主要是多任务的初探~比较简单,主要是尝试保存当前任务.任务切换.恢复当前任务,而真正的多任务要比这个复杂的多,因为包含互不干扰,甚至是高度优化的并行技术! 一.保存当前任务: >_<" 当向CPU发出切换命令的时候,CPU会先把寄存器中的值全部写入内存中,这样当切换回来时,可以从中断的地方继续执行.接下来,为了运行下一个程序,CPU会把所有的寄存器中的值从内存中读取出来,这就完成了一次切换. >_<" 这里的结构TS

编译器后端,寄存器分配算法

寄存器分配,是通过将程序变量尽可能地分配到寄存器,从而提高程序执行速度的一种方法.寄存器是编译器优化中最为重要的问题之一(好的寄存器分配能够提高程序执行速度超过250%):也是编译器理论中最热点的研究领域之一(研究界已经提出来大量寄存器分配相关的算法). 1. 图着色(graph coloring)方法是解决寄存器分配问题最常用的方法. 利用相交图(interference graph)来表示程序变量的生命期是否相交,将寄存器分配给变量的问题,可以近似地看成是给相交图着色:相交图中,相交的节点不

数据结构与寄存器

一. 缘起 看代码时,我常常注意到这样一种现象.从宏观角度上看代码,整个代码主体都是赋值语句.在偏硬件比如嵌入式系统中,绝大多数赋值语句都是在给寄存器赋值:而在软件系统中,绝大多数赋值语句都是在对选定的数据结构赋值.统一而言就是,在我接触的代码结构中,代码就是在操作数据结构或者寄存器.操作的方法我们称为“算法”. 既然如此,那么数据结构与寄存器之间是否存在某种联系呢? 二.寄存器 简单的说,寄存器是一种数字电路,可以存储二进制数据.在x86或者ARM系统中都有大量寄存器接口供用户操作.比如ARM

ADC和RTC的寄存器的读取

ADC的寄存器读取,int adc_read(void){ int result; #if ADSTART==0 result = ADC.ADCDAT0&0x3ff; while(!(ADC.ADCCON&(0x1<<15))) { }#elif ADSTART==1 while(!(ADC.ADCCON&(0x1<<15))) { } result = ADC.ADCDAT0&0x3ff;#endif return 3300/0x3ff*resu

arm: 使用结构体操作寄存器,volatile

使用结构体操作寄存器: //寄存器赋值和取值的时候,要注意寄存器的长度,有的寄存器的值只有8位. //还要注意,使用volatile修饰寄存器变量. //addr.h typedef unsigned int S3C24X0_REG32; /* NAND FLASH (see S3C2410 manual chapter 6) */ typedef struct { S3C24X0_REG32 NFCONF; S3C24X0_REG32 NFCMD; S3C24X0_REG32 NFADDR;

汇编语言——寄存器(内存访问 ds数据段寄存器,ss栈段寄存器)

在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? #  20H(2)0地址字单元中存放的字型数据是多少? # 4e20H(3)2地址字单元中存放的字节型数据是多少? # 12H(4)2地址单元中存放的字型数据是多少?    #  0012H(5)1地址字单元中存放的字型数据是多少? #