Search

화면 버퍼, 화면 제어

대분류
CS
소분류
OS
유형
C
시스템 프로그래밍
최종 편집 일시
2024/10/27 15:50
생성 일시
2022/04/04 06:00
15 more properties

Control

[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS세그먼트 레지스터에 0x07C0을 복사하면서 START 레이블로 이동 START: mov ax, 0x07C0 ; 부트로더의 시작 어드레스(0x7C00)를 세그먼트 레지스터 값으로 변환 mov ds, ax ; DS 세그먼트 레지스터에 설정 mov ax, 0xB800 ; 비디오메모리의 시작어드레스(0xB800)를 세그먼트 레지스터 값으로 변환 mov es, ax ; ES 세그먼트 레지스터에 설정 mov si, 0 ; Initialize si register .SCREENCLEARLOOP: mov byte [ es: si ], 0 ; delete character at si index mov byte [ es: si + 1], 0x0A ; copy 0x)A(black / gree) add si, 2 ; go to next location cmp si, 80 * 25 *2 ; compare si and screen size jl .SCREENCLEARLOOP ; end loop if si == screen size mov si, 0 ; initialize si register mov di, 0 ; initialize di register .MESSAGELOOP: mov cl, byte [ si + MESSAGE1 ] ; copy charactor which is on the address MESSAGE1's addr + SI register's value cmp cl, 0 ; compare the charactor and 0 je .MESSAGEEND ; if value is 0 -> string index is out of bound -> finish the routine mov byte [ es : di], cl ; if value is not 0 -> print the charactor on 0xB800 + di add si, 1 ; go to next index add di, 2 ; go to next video address jmp .MESSAGELOOP ; loop code .MESSAGEEND: jmp $ ; infinite loop MESSAGE1: db 'OS Boot Loader Start!!', 0 ; define the string tha I want to print times 510 - ($ - $$) db 0x00 ; $: 현재 라인의 어드레스 ; $$: 현재 섹션(.text)의 시작 어드레스 ; $ -$$: 현재 섹션을 기준으로 하는 오프셋 ; 510 - ($ - $$): 현재부터 어드레스 510까지 ; db 0x00: 1바이트를 선언하고 값은 0x00 ; time: 반복수행 ; 현재 위치에서 어드레스 510까지 0x00으로 채움 db 0x55 ; 1바이트를 선언하고 값은 0x55 db 0xAA ; 1바이트를 선언하고 값은 0xAA ; 어드레스 511, 5120x55, 0xAA를 써서 부트 섹터로 표기함코
C
복사