Diary-day2 de desarrollo del sistema operativo

Empezando con el montaje

Comando DB: la abreviatura de "byte de datos", que significa el comando para escribir un byte directamente en el archivo

Instrucción RESB: la abreviatura de "byte de reserva", si se escribe como RESB 10, significa que reservamos 10 bytes.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
La diferencia entre DD, DW y DB
Inserte la descripción de la imagen aquí
; la función del símbolo es un comentario, que es equivalente al símbolo // de C ++. La función del comando DB también se ha ampliado y puede escribir cadenas directamente. El símbolo $ es una variable que nos puede decir el número actual de caracteres en esta línea.

En el programa de inicio, debemos asegurarnos de que el byte 510 (es decir, el 0x1fe) comience en 0x55 0xaa. Usando el símbolo $, podemos calcular directamente cuántos bytes se necesitan para poner 0x00.

El significado de algunas expresiones profesionales en el código fuente anterior es el siguiente
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
: Instrucción ORG: esta instrucción le dice al compilador en qué dirección de la memoria debe cargar estas instrucciones en lenguaje de máquina cuando se comienza a ejecutar. Con esta instrucción, el significado del signo de dólar $ también tendrá algunos cambios, representará la dirección de memoria a leer.

La instrucción ORG proviene del inglés "origin", que significa "fuente, punto de partida". Le dirá al compilador que el programa debe comenzar en la dirección especificada, es decir, cargar el programa en la dirección especificada en la memoria. La dirección especificada aquí es 0x7c00. Para muchas personas, la dirección 0x7C00 es muy misteriosa. No sé cuál es. Pero para aquellos que han entendido el proceso de arranque del BIOS en la plataforma x86, esta dirección no puede ser más familiar. El BIOS lee el MBR en la dirección 0x7C00 y luego realiza el arranque posterior. Los desarrolladores del sistema operativo o del cargador de arranque deben asumir que su código ensamblador se carga y ejecuta desde 0x7C00.

Instrucción de entrada: esta instrucción se utiliza para especificar el destino de salto de la instrucción JMP, etc.

Instrucción MOV: La función de esta instrucción es muy simple. Es una función de asignación. Aunque simple, la instrucción MOV tiene diferentes significados en diferentes escenarios. Su dominio es esencial para dominar el ensamblaje y el desarrollo del sistema operativo.

Hay un circuito llamado registro en la CPU, que es equivalente a una variable en lenguaje máquina. Existen los siguientes 8 registros representativos, que se explican brevemente aquí:

  • AX: acumulador, registro acumulativo
  • CX: contador, registro de conteo
  • DX: datos, registro de datos
  • BX: base, registro de direcciones base
  • SP: puntero de pila, registro de puntero de pila
  • BP: puntero base, registro de puntero base
  • SI: índice de origen, registro de índice de origen
  • DI: índice de destino, registro de índice de destino

Estos registros son registros de 16 bits y pueden almacenar números binarios de 16 bits.

Inserte la descripción de la imagen aquí
El total de estos 8 registros es de solo 16 bytes. En otras palabras, incluso si usamos todos estos 8 registros, la CPU solo puede almacenar 16 bytes.

Por otro lado, hay 8 registros de 8 bits en la CPU.

  • AL: bit bajo del registro de acumulación
  • CL: bit bajo de registro de conteo
  • DL: bit bajo de registro de datos
  • BL: bit bajo del registro base
  • AH: el bit alto del registro acumulativo
  • CH: bit alto de registro de conteo
  • DH: bit alto de registro de datos
  • BH: El bit alto del registro de dirección base.
    Inserte la descripción de la imagen aquí
    Debe tenerse en cuenta que los registros BP, SP y DI no tienen distinción entre bits altos y bajos. Si tiene que tomar los bits bajos y altos de estos registros, primero debe MOV, AX y SI. Asigne el valor de SI a AX, y luego use AL y AH para obtener el valor.

Por encima de 16 bits hay CPU y registros de 32 bits. Los nombres de los registros correspondientes son EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

Sin embargo, para un registro de 32 bits, queremos usar sus 16 bits altos, pero no es tan conveniente como un registro de 16 bits que puede tomar fácilmente sus 8 bits bajos y sus 8 bits altos. Debemos desplazar los 32 bits altos. Mueva los datos altos de 16 bits a los bajos de 16 bits para obtener los datos altos correspondientes de 16 bits.

En cuanto a los registros, existen varios registros llamados registros de segmento, y estos registros de segmento son todos registros de 16 bits.

  • ES: registro de segmento adicional
  • CS: Registro de segmento de código
  • SS: registro de segmento de pila
  • DS: registro de segmento de datos
  • FS: sin nombre
  • GS: Sin nombre

MOV SI, msg El significado de este código es poner la dirección inicial del segmento de código correspondiente a la etiqueta msg en el registro de índice de fuente SI.

Aquí hay una breve explicación de la relación entre la CPU y la memoria. Si la CPU es una persona poderosa con poder real, entonces la memoria es una sala de almacenamiento externa. En otras palabras, la CPU necesita pensar en la memoria a través de algunos de sus pines (cables) Enviar una señal eléctrica para decirle a la memoria que transfiera los datos en la dirección correspondiente a través de mi pin (cable). Así es como la CPU intercambia información al leer y escribir datos en la memoria.

La memoria está bastante lejos de la CPU, incluso si está a solo unos 10 cm de distancia, pero esto está bastante lejos de la distancia entre los registros internos de la CPU y la CPU misma. Por lo tanto, la velocidad de la CPU que accede a la memoria es mucho menor que la velocidad de acceso a los registros. de.

A continuación, analizaremos una instrucción MOV AL, [SI] que aparece en el código anterior En nuestra descripción anterior, la fuente de transferencia de datos y el destino de transferencia de la instrucción MOV pueden ser no solo registros o constantes, sino también direcciones de memoria. En este momento, se pueden usar corchetes [] para indicar la dirección de memoria El significado del código ensamblador anterior es poner los datos almacenados en una dirección de memoria almacenada en el registro SI en el registro AL.

Aunque podemos usar registros para especificar direcciones de memoria, los registros que se pueden usar para este propósito son muy limitados, solo BX, BP, SI y DI. El resto de AX, CX, DX y SP no se pueden utilizar para especificar direcciones de memoria debido a que la CPU no tiene un circuito para procesar tales instrucciones o no existe un lenguaje de máquina para tal procesamiento. Por supuesto, dicho procesamiento no se puede realizar sin el correspondiente lenguaje de máquina.

La instrucción MOV tiene una regla, es decir, los datos de origen y los datos de destino deben tener el mismo número de bits. En otras palabras, solo BYTE se puede sustituir en AL. De esta manera, se puede omitir BYTE.

INT es una instrucción de interrupción de software. Hay un programa llamado BIOS en la computadora, que se ensambla en la unidad ROM de la placa base de la computadora cuando sale de fábrica. Los fabricantes de computadoras han escrito previamente algunos programas que los desarrolladores de sistemas operativos utilizan con frecuencia en el BIOS, lo cual es muy conveniente. BIOS es la abreviatura del sistema básico de entrada y salida en inglés, traducido literalmente es el programa básico de entrada y salida.

El BIOS reciente tiene muchas funciones, incluso la pantalla de configuración de la computadora, pero su esencia es como su nombre, es una colección de varias funciones preparadas para desarrolladores de sistemas operativos, y la instrucción INT es la instrucción utilizada para llamar a estas funciones. . Hay un número después de INT, que es equivalente a varias de estas funciones. Se pueden llamar diferentes funciones de BIOS a través de diferentes números. El código anterior llama a la función 0x10, y su función es controlar la tarjeta gráfica.

Luego, la función correspondiente se puede realizar implementando el contenido del registro de acuerdo con los requisitos de la BIOS. El siguiente es el requisito para mostrar el registro correspondiente a un carácter.
Inserte la descripción de la imagen aquí
Hay una instrucción HLT. La función de esta instrucción es poner la CPU en un estado de suspensión hasta que la externa Cuando hay un cambio, como mover el mouse o presionar el teclado, la CPU se activará y evitará que la CPU funcione inútilmente.

De esta manera, para el programa anterior, podemos mostrar los datos escritos en msg carácter por carácter, y después de que los datos se conviertan en 0, la instrucción HLT hará que el programa entre en un bucle infinito. Un hola mundo se muestra así.

En cuanto a la razón por la que la dirección de ORG debería apuntar a 0x7c00: En
Inserte la descripción de la imagen aquí
pocas palabras, cuando el fabricante escribe el BIOS, necesita ocupar una parte de la dirección de memoria, por lo que los desarrolladores de nuestro sistema operativo no pueden usar estas direcciones, de lo contrario habrá muchas de conflictos. De la misma manera, hay algunos lugares en la memoria que no podemos usar, por lo que habrá regulaciones de que nuestra dirección debe partir de un lugar determinado.

Código fuente del programa

; boot.s引导程序
; hello-os
; TAB=4
		ORG 0x7c00
		
;以下是FAT12的描述
		jmp entry
		db x90
		DB“HELLOIPL”			;可以自由地写引导扇区的名称(8字节)
		DW 512					;一个扇区的大小(必须是512)
		DB 1					;集群的大小(必须是一个扇区)
		DW 1					;FAT从哪里开始(通常是从第一扇区开始)
		DB 2					;FAT的个数(必须是2)
		DW 224					;根目录区域的大小(通常是224个条目)
		DW 2880					;这个驱动器的大小(必须是2880扇区)
		DB 0xf0					;媒体类型(必须是0xf0)
		DW 9					;FAT区域的长度(必须是9扇区)
		DW 18					;1条轨道上有多少扇区(必须是18)
		DW 2					;头部的数量(必须是2)
		DD 0					;因为没有使用分区,所以这里肯定是0。
		DD 2880					;再写一次这个驱动器的大小
		DB 0,0,0x29				;虽然不太清楚,但应该是这个值。
		DD 0xffffffffff			;可能是音量序列号
		DB“HELLO-OS”			;磁盘名称(11字节)
		DB“FAT12”				;格式名称(8字节)
		RESB 18					;姑且留出18个字节

entry:
		MOV		AX,0			;寄存器初始化
		MOV		SS,AX			;SS:栈段寄存器
		mov     sp,0x7c00 		;栈指针赋为0x7c00,既引导程序初始地址,SP:栈指针寄存器
		MOV		DS,AX			;DS:数据段寄存器
		MOV		ES,AX			;ES:附加段寄存器
		
		MOV		SI,msg			;SI:source index,源变址寄存器

putloop:	
		MOV		AL,[SI]			;将第一个字符->AL
		ADD		SI,1			;SI+1
		cmp  	AL,0      		;比较0寻找最后一个字符,msg之后的byte是0
		JE		fin				;如果=0,则跳转到fin的地址位置
		mov  	AH,0x0e   		;显示字符(字符显示功能);指定文字
		MOV		BX,15			;指定颜色(黑色)
		INT		0x10			;调用video bios中断
		JMP  	putloop			;循环跳回
		
fin:
		HLT						;cpu休眠
		JMP		fin				;无限循环
		
msg:
		DB		0x0a, 0x0a		; 换行*2
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x7dfe-$		;0x00填充到0x7dfe的命令

		DB		0x55, 0xaa

Supongo que te gusta

Origin blog.csdn.net/weixin_45394002/article/details/113811442
Recomendado
Clasificación