Diary-day4 de desarrollo del sistema operativo

; 今日添加的内容

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 柱面0
		MOV		DH,0			; 磁头0
		MOV		CL,2			; 扇区2

		MOV		AH,0x02			; AH=0x02 : 磁盘读取
		MOV		AL,1			; 1个扇区
		MOV		BX,0
		MOV		DL,0x00			; A驱动器
		INT		0x13			; 磁盘BIOS调用
		JC		error

La función de la instrucción JC: El
llamado JC es la abreviatura de jump if carry, lo que significa que si es solo el bit de bandera 1, entonces salta.

Con respecto a la instrucción INT 0x13, sabemos que es para llamar a la función BIOS 0x13, pero aún no entendemos qué hace.

Podemos encontrar lo siguiente:

  • Lectura, escritura, verificación de sector y búsqueda de disco
  • AH = 0x02 (leer disco)
  • AH = 0x03
  • AH = 0x04
  • AH = 0x0c
  • AL = el número de sectores a procesar; (procesamiento simultáneo inteligente de sectores consecutivos)
  • CH = Número de cilindro y 0xff
  • CL = número de sector (0-5 dígitos) | (número de cilindro & 0x300) >> 2;
  • DH = número de cabeza
  • DL = letra de la unidad;
  • ES: BX = dirección de búfer; (marque, es decir, no se usa al buscar)
  • valor de retorno
  • FLACS.CF0: Sin error, AH0
  • FLACS.CF == 1: Hay un error, el número de error se almacena en AH

El FLACS.CF en el valor de retorno significa que después de llamar a esta función en el BIOS, si no hay ningún error, la bandera de acarreo es 0, y si hay un error, la bandera de acarreo es 1.

Hay algunos registros de 1 bit en la CPU. Llamamos bandera a este registro de 1 bit. No hay bandera en inglés y hay varios otros registros de 1 bit. CH, CL, DH y DL son el número de cilindro, el número de sector, el número de cabezal y el número de transmisión, respectivamente.

La estructura del disquete:
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
El programa desarrollado hasta ahora no ha considerado el registro de segmento, pero de hecho tenemos que especificar cualquier dirección en la memoria, también debemos especificar el registro de segmento. Generalmente, si se omite, el registro de segmento de datos DS se usará como el registro de segmento predeterminado.

Inserte la descripción de la imagen aquí
Haga doble clic en! Cons_nt.bat, ingrese make run en cmd,
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
no se muestra ningún mensaje de error, si hay un mensaje de error, se mostrará un mensaje de error.

Debido a la falta de confiabilidad del disquete, a veces sucede que los datos no se pueden leer, en este momento, simplemente léalo de nuevo. Entonces, incluso si hay uno o dos errores, déjelo volver a leer unas cuantas veces. Sobre la base del programa anterior, más las siguientes optimizaciones, puede lograr una lectura de bucle cuando se produzcan errores.
Inserte la descripción de la imagen aquí
La función de la instrucción JNC: lo opuesto a la función JC, es decir, si la bandera de acarreo es 0, saltará. JAE también es un salto condicional, lo que significa saltar cuando es mayor o igual a.

Antes de volver a leer el disco, se realiza el procesamiento de AH = 0x00, DL = 0x00, INT 0x13, la función es restablecer el estado del disquete y volver a leerlo.

Leer 18 sectores Leer sectores
Inserte la descripción de la imagen aquí
de forma circular, es decir, repetir las funciones anteriores de forma circular. Aunque la pantalla final es la misma que antes, en este momento hemos leído los 512 * 17 bytes en el disco a 0x8200 ~ 0xa3ff en la memoria.

Luego lea 10 cilindros. Aquí hay otra instrucción EQU, que es la abreviatura de igual, CYLS EQU 10 significa CYLS = 10.

CYLS EQU 10; hasta qué punto
ORG 0x7c00; dónde se leerá este programa

Tema adicional: al guardar un archivo en un disquete vacío
(1), el nombre del archivo se escribirá en el lugar posterior a 0x002600
(2) el contenido del archivo se escribirá en el lugar posterior a 0x004200

Los programas escritos ahora comienzan desde el área de arranque y cargan el contenido del disco en la dirección de memoria 0x8000, por lo que el contenido del disco 0x4200 debe ubicarse en la dirección de memoria 0x8000 + 0x4200 = 0xc200.

Escriba ORG 0xc200 en otro archivo haribote.nas, y luego agregue la instrucción JMP 0xc200 al final del procesamiento de ipl.nas, puede saltar desde el final de ipl.nas a esta dirección de memoria para continuar ejecutando el contenido del código.

Inserte la descripción de la imagen aquí
A continuación, escribimos el siguiente comando en haribote.nas para que aparezca una ventana negra en la ventana de la línea de comandos final

; haribote-os
; TAB=4

		ORG		0xc200			; 这个程序会被读取到哪里

		MOV		AL,0x13			; VGA图形,320x200x8bit颜色
		MOV		AH,0x00
		INT		0x10
fin:
		HLT
		JMP		fin

Después de configurar AH = 0x00, llame a la función 0x10 del BIOS de la tarjeta gráfica para cambiar el modo de visualización. Aquí seleccione el modo de imagen 0x13 y se pueden usar 256 colores en el modo de color de 8 bits.

Inserte la descripción de la imagen aquí
Después de ejecutarlo, aparece una ventana negra con éxito, lo que indica que el programa se está ejecutando normalmente, se convierte en un modo gráfico y el cursor desaparece.
Inserte la descripción de la imagen aquí
Preparativos preliminares para la
modificación del modo de 32 bits de harness.nas

;haribote-os
;TAB = 4

; 有关BOOT_INFO
CYLS    EQU 0x0ff0      ;设定启动区
LEDS    EQU 0x0ff1
VMODE   EQU 0x0ff2      ;有关颜色数目的信息
SCRNX   EQU 0x0ff4      ;分辨率的x
SCRNY   EQU 0x0ff6      ;分辨率的y
VRAM    EQU 0x0ff8      ;图像缓冲区的开始地址,VRAM指显卡内存

    ORG     0xc200      ;程序要装载的地方

    MOV     AL,0x13     ;VGA显卡,32x00x8位颜色
    MOV     AH,0x00     ;设置AH=0x00,调用显卡BIOS函数,就可以切换显示模式了,AL中设置模式
    INT     0x10        

    MOV     BYTE [VMODE],8    ; 记录画面模式
    MOV     WORD [SCRNX],320
    MOV     WORD [SCRNY],200
    MOV     DWORD [VRAM],0x000a0000 ;这种画面模式下"VRAM是0xa00000xaffff64KB

; 用BIOS取得键盘上各种LED指示灯的状态

    MOV     AH,0x02
    INT     0x16            ; keyboard BIOS
    MOV     [LEDS],AL
fin:
    HLT
    JMP fin

El llamado modo de 32 bits se refiere al modo de la CPU. La CPU tiene dos modos: 16 bits y 32 bits. Si comienza en modo de 16 bits, es muy conveniente utilizar registros de 16 como AX y CX, por el contrario, los registros de 32 bits como EAX y ECX son muy incómodos de usar. Además, los códigos de comando del lenguaje de máquina son diferentes en 16 bits y 32 bits. El mismo lenguaje de máquina tiene diferentes métodos de interpretación, por lo que el lenguaje de máquina en modo de 16 bits no puede ejecutarse en modo de 32 bits y viceversa.

Pero hay un punto, en el modo de 32 bits, no puede llamar a las funciones del BIOS, porque el BIOS está escrito en un lenguaje de máquina de 16 bits. Si tenemos algo que ver con la BIOS, podemos hacerlo al principio, una vez que ingresamos al modo de 32 bits, no podemos llamar a las funciones de la BIOS. (También existe un método para volver de 32 bits a 16 bits, pero es un poco complicado)

Hemos obtenido el modo de pantalla del BIOS. El siguiente paso es obtener el estado del teclado del BIOS. El llamado estado del teclado es el estado de si NumLock está encendido o apagado.

Supongo que te gusta

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