bits 16
gdtEntry:
.size: dw 55
.pointer: dd 0x7000
; void describe_gdt()
describe_gdt:
.setup:
push es
xor ax, ax
mov es, ax
mov di, [gdtEntry.pointer]
.describe:
; NULL descriptor
gdtNullOffset: equ 0
mov [es:di], word 0x0000
mov [es:di + 2], word 0x0000
mov [es:di + 4], byte 0x00
mov [es:di + 5], byte 0x00
mov [es:di + 6], byte 0x00
mov [es:di + 7], byte 0x00
add di, 8
; Code segment descriptor (16-bit)
gdtCode16Offset: equ 8
mov [es:di], word 0xffff ; Limit of 4GB
mov [es:di + 2], word 0x0000 ; Base
mov [es:di + 4], byte 0x00 ; More base bits
mov [es:di + 5], byte 0x98 ; Access (present and executable are set)
mov [es:di + 6], byte 0x00 ; Flags (granularity and size) and limit
mov [es:di + 7], byte 0x00 ; More base bits
add di, 8
; Data segment descriptor (16-bit)
gdtData16Offset: equ 16
mov [es:di], word 0xffff ; Limit of 4GB
mov [es:di + 2], word 0x0000 ; Base
mov [es:di + 4], byte 0x00 ; More base bits
mov [es:di + 5], byte 0x92 ; Access (present and writable are set)
mov [es:di + 6], byte 0x00 ; Flags (granularity and size) and limit
mov [es:di + 7], byte 0x00 ; More base bits
add di, 8
; Code segment descriptor (32-bit)
gdtCode32Offset: equ 24
mov [es:di], word 0xffff ; Limit of 4GB
mov [es:di + 2], word 0x0000 ; Base
mov [es:di + 4], byte 0x00 ; More base bits
mov [es:di + 5], byte 0x9a ; Access (present, executable, and readable are set)
mov [es:di + 6], byte 0xcf ; Flags (granularity and size) and limit
mov [es:di + 7], byte 0x00 ; More base bits
add di, 8
; Data segment descriptor (32-bit)
gdtData32Offset: equ 32
mov [es:di], word 0xffff ; Limit of 4GB
mov [es:di + 2], word 0x0000 ; Base
mov [es:di + 4], byte 0x00 ; More base bits
mov [es:di + 5], byte 0x92 ; Access (present and writable are set)
mov [es:di + 6], byte 0xcf ; Flags (granularity and size) and limit
mov [es:di + 7], byte 0x00 ; More base bits
add di, 8
; Code segment descriptor (64-bit)
gdtCode64Offset: equ 40
mov [es:di], word 0x0000
mov [es:di + 2], word 0x0000
mov [es:di + 4], byte 0x00 ; Base bits
mov [es:di + 5], byte 0x9a ; Access (present and executable are set)
mov [es:di + 6], byte 0xa0 ; Flags: granularity=1, long mode
mov [es:di + 7], byte 0x00 ; Base bits
add di, 8
; Data segment descriptor (64-bit)
gdtData64Offset: equ 48
mov [es:di], word 0x0000
mov [es:di + 2], word 0x0000
mov [es:di + 4], byte 0x00 ; Base bits
mov [es:di + 5], byte 0x92 ; Access (present and writable are set)
mov [es:di + 6], byte 0x80 ; Flags: granularity=1
mov [es:di + 7], byte 0x00 ; Base bits
.cleanup:
pop es
ret
; void describe_idt()
describe_idt:
.setup:
push es
xor ax, ax
mov es, ax
mov di, [idtEntry.pointer]
.describe:
mov cx, 1024
rep stosw
.cleanup:
pop es
ret
idtEntry:
.size: dw 1024
.pointer: dd 0x7100
idtEntryRealMode:
.size: dw 1024
.pointer: dd 0x0000