📄 pm12a.asm
字号:
; data segment descriptor
USER_DATA_SEL equ $-gdt+3
gdt5: dw 0xFFFF
dw 0 ; (base gets set above)
db 0
db 0xF2 ; present, ring 3, data, expand-up, writable
db 0xCF
db 0
; user TSS
USER_TSS equ $-gdt
gdt6: dw 103
dw 0 ; set to tss
db 0
db 0xE9 ; present, ring 3, 32-bit available TSS
db 0
db 0
gdt_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; interrupt descriptor table (IDT)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 32 reserved interrupts:
idt: dw isr0 ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0 ; entry point 31:16 (XXX - isr0 >> 16)
dw isr1
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr3
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr4
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr5
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr6
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr7
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr8
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr9
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr0A
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr0B
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr0C
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr0D
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr0E
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr0F
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr10
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr11
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr12
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr13
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr14
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr15
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr16
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr17
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr18
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr19
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr1A
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr1B
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr1C
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr1D
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr1E
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr1F
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr20
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr21
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr22
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr23
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr24
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr25
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr26
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr27
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr28
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr29
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2A
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2B
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2C
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2D
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2E
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr2F
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
dw isr30
dw SYS_CODE_SEL
db 0
db 0xEE ; Ring 3 interrupt gate
dw 0
idt_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; task state segment
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tss: dw 0, 0 ; back link
tss_esp0:
dd 0 ; ESP0
dw SYS_DATA_SEL, 0 ; SS0, reserved
dd 0 ; ESP1
dw 0, 0 ; SS1, reserved
dd 0 ; ESP2
dw 0, 0 ; SS2, reserved
dd 0 ; CR3
dd 0, 0 ; EIP, EFLAGS (EFLAGS=0x200 for ints)
dd 0, 0, 0, 0 ; EAX, ECX, EDX, EBX
dd 0, 0, 0, 0 ; ESP, EBP, ESI, EDI
dw 0, 0 ; ES, reserved
dw 0, 0 ; CS, reserved
dw 0, 0 ; SS, reserved
dw 0, 0 ; DS, reserved
dw 0, 0 ; FS, reserved
dw 0, 0 ; GS, reserved
dw 0, 0 ; LDT, reserved
dw 0, 0 ; debug, IO perm. bitmap
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; taskA data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
times 63 dd 0
stackA: dd 0
; regs popped by popa (ESP is popped and discarded)
regsA: dd 0, 0, 0, 0, 0, 0, 0, 0 ; EDI, ESI, EBP, EBX, EDX, ECX, EDX
; regs popped by pop ds, etc.
regsA1: dw USER_DATA_SEL, 0 ; DS
dw USER_DATA_SEL, 0 ; ES
dw USER_DATA_SEL, 0 ; FS
dw USER_DATA_SEL, 0 ; GS
; regs popped by iret
[EXTERN _taskA]
regsA2: dd _taskA ; EIP
dw USER_CODE_SEL, 0 ; CS
dd 0x200 ; EFLAGS (0x200 enables ints)
dd stackA ; ESP
dw USER_DATA_SEL, 0 ; SS
regsA3:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; taskB data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
times 63 dd 0
stackB: dd 0
regsB: dd 0, 0, 0, 0, 0, 0, 0, 0
regsB1: dw USER_DATA_SEL, 0
dw USER_DATA_SEL, 0
dw USER_DATA_SEL, 0
dw USER_DATA_SEL, 0
[EXTERN _taskB]
regsB2: dd _taskB
dw USER_CODE_SEL, 0
dd 0x200
dd stackB
dw USER_DATA_SEL, 0
regsB3:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -