| ÇØÅ·ÀßÇϰí½Í´Ù |
; serial µå¶óÀ̹ö ÃʱâÈ ÇÔ¼ö
global init_serial
global serial_write_char
section .text
; void init_serial()
init_serial:
mov dx, 0x3F8 ; COM1 Æ÷Æ®
mov al, 0x00
out dx, al ; Interrupt Disable Register = 0
mov dx, 0x3FB ; Line Control Register
mov al, 0x80
out dx, al ; DLAB (enable baud rate divisor)
mov dx, 0x3F8 ; Divisor Low Byte (baud rate)
mov al, 0x03 ; 38400 baud (divisor = 3)
out dx, al
mov dx, 0x3F9 ; Divisor High Byte
mov al, 0x00
out dx, al
mov dx, 0x3FB
mov al, 0x03 ; 8 bits, no parity, one stop bit
out dx, al
mov dx, 0x3FC ; FIFO Control Register
mov al, 0xC7 ; Enable FIFO, clear them, with 14-byte threshold
out dx, al
mov dx, 0x3FE ; Modem Control Register
mov al, 0x0B ; IRQs enabled, RTS/DSR set
out dx, al
ret
; void serial_write_char(char c)
; c is in AL
serial_write_char:
mov dx, 0x3F8 ; Wait until transmit buffer is empty
.wait:
in al, 0x3FD
test al, 0x20
jz .wait
mov dx, 0x3F8
out dx, al ; Write character
ret
extern void init_serial();
extern void serial_write_char(char c);
void kmain() {
init_serial();
char* msg = "Hello from assembly serial driver!\r\n";
for (int i = 0; msg[i] != '\0'; i++) {
serial_write_char(msg[i]);
}
while (1);
} |
2025/03/21 |
|