왜 제대로 실행결과가 나오지 않을까요 ..
글쓴이: Reper / 작성시간: 월, 2015/07/27 - 1:42오후
[org 0] [bits 16] start: mov ax, cs mov ds, ax xor ax, ax mov ss, ax mov ax, 0xB800 mov es, ax xor edi, edi lea esi, [ds:msgRMode] call print cli lgdt[gdtr] mov eax, cr0 or eax, 0x00000001 mov cr0, eax jmp $+2 nop nop ;db 0x66 ;db 0x67 ;db 0xEA ;dd pm_start ;dw sys_code_selector JMP DWORD sys_code_selector:pm_start ; From now on, Protected Mode will be started. [bits 32] pm_start: mov bx, sys_data_selector mov ds, bx mov es, bx mov fs, bx mov gs, bx mov ss, bx xor eax, eax mov ax, video_selector mov es, ax mov edi, 80 * 2 * 10 + 2 * 10 lea esi, [ds:msgPMode] call print jmp $ ; Subroutines print: push eax print_loop: or al, al jz print_end mov al, byte [esi] mov byte [es:edi], al inc edi mov byte [es:edi], 0x07 inc esi inc edi jmp print_loop print_end: pop eax ret msgPMode db "Protected Mode" , 0 msgRMode db "Real Mode" , 0 ; GDT Table gdtr: dw gdt_end - gdt - 1 dd gdt + 0x10000 gdt: dw 0 dw 0 db 0 db 0 db 0 db 0 ; code segment descriptor sys_code_selector equ 0x08 dw 0xFFFF dw 0x0000 db 0x01 db 0x9A db 0xCF db 0x00 ; data segment descriptor sys_data_selector equ 0x10 dw 0xFFFF dw 0x0000 db 0x01 db 0x92 db 0xCF db 0x00 ; video segment descriptor video_selector equ 0x18 dw 0xFFFF dw 0x8000 db 0x0B db 0x92 db 0x40 db 0x00 gdt_end:
보호 모드로 진입하기 전 리얼 모드에서도 문자열을 출력하고자 합니다. 그런데 이미지를 만들고 나서 부팅시 문자열 출력이 두 부분 모두 되질 않네요...
리얼 모드에서 문자열을 출력하는 부분쪽을 지워버리면 보호 모드에서는 출력이 잘 됩니다. 왜 두 모드에서 같은 print 함수를 사용해서 문자열을 화면에
띄우려고 하면 안되는 걸까요 .... 제가 생각하기론 16비트와 32비트 명령어의 차이 때문에 발생하는 현상 같은데 .. 혹시 도움을 좀 주실 수 있는분 계신가요 ..
Forums:
댓글 달기