加载文件
来源:互联网 发布:医学继续教育网络 编辑:程序博客网 时间:2024/05/16 09:10
mp short start
nop
%define PCI_BUS_SHIFT 0x08
%define PCI_DEVICE_SHIFT 0x03
%define PCI_FUNCTION_SHIFT 0x00
%define PCI_BUS_MAX 0xff
%define PCI_DEVICE_MAX 0x1f
%define PCI_FUNCTION_MAX 0x07
%define SETUP_ADDRESS 0x1000
%define LOADER_ADDRESS 0x8000
%define KERNEL_ADDRESS 0x9000
DA_P EQU 1<<7
DA_DPL1 EQU 0x01<<5
DA_DPL2 EQU 0x02<<5
DA_DPL3 EQU 0x03<<5
DA_DT EQU 1<<4
DA_E EQU 1<<3
DA_A EQU 1<<0
DA_W EQU 1<<1
DA_ED EQU 1<<2
DA_R EQU 1<<1
DA_C EQU 1<<2
DA_G EQU 1<<15
DA_D EQU 1<<14
DA_AVL EQU 1<<12
DA_286TSS EQU 0x01
DA_LDT EQU 0x02
DA_286TSS_ EQU 0x03
DA_286CALL EQU 0x04
DA_TASK EQU 0x05
DA_286INTERUPT EQU 0x06
DA_286TRAP EQU 0x07
DA_386TSS EQU 0x09
DA_386TSS_ EQU 0x0b
DA_386CALL EQU 0x0c
DA_386INTERUPT EQU 0x0e
DA_386TRAP EQU 0x0f
TIL EQU 1<<2
RPL0 EQU 0x00
RPL1 EQU 0x01
RPL2 EQU 0x02
RPL3 EQU 0x03
%macro Descriptor 3
dw %2 & 0xffff
dw %1 & 0xffff
db (%1 >> 0x10) & 0xff
dw %3 | ((%2 >> 0x10) & 0x0f)
db (%1 >> 24) & 0xff
%endmacro
%macro Gate 3
dw %2 & 0xffff
dw %1
dw %3
dw (%2 >> 0x10) & 0xffff
%endmacro
[SECTION .stack]
times 512 db 0
TopOfStack EQU $
times 512 db 0
TopOfStack1 EQU $
times 512 db 0
TopOfStack2 EQU $
[SECTION .data]
null: Descriptor 0, 0, 0
SelectorCode EQU $ - null
code: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_E|DA_R|DA_D
SelectorText EQU $ - null + RPL3
text: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_E|DA_R|DA_D|DA_DPL3
SelectorData EQU $ - null
data: Descriptor 0, 0xffff, DA_P|DA_G|DA_DT|DA_W|DA_R
SelectorVideo EQU $ - null + RPL3
video: Descriptor 0xb8000, 0xffff, DA_P|DA_DT|DA_W|DA_R|DA_DPL3
SelectorStack EQU $ - null
stack: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_W|DA_R
SelectorStackRPL3 EQU $ - null + RPL3
.stack: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_W|DA_R|DA_DPL3
SelectorLdt EQU $ - null
ldts: Descriptor 0, 0xffff, DA_P|DA_G|DA_LDT
SelectorTss EQU $ - null + RPL3
tsss: Descriptor 0, 0xffff, DA_P|DA_G|DA_386TSS|DA_DPL3
SelectorTss1 EQU $ - null + RPL3
tsss1: Descriptor 0, 0xffff, DA_P|DA_G|DA_386TSS|DA_DPL3
len EQU $ - null
gdtr: dw len
dd LOADER_ADDRESS*0x10 + null
ldt:
code_sel EQU $ - ldt + TIL
.code: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_E|DA_W|DA_DT|DA_D
data_sel EQU $ - ldt + TIL
.data: Descriptor 0, 0xffff, DA_P|DA_G|DA_R|DA_W|DA_DT
stack_sel EQU $ - ldt + TIL
.stack: Descriptor 0, 0xffff, DA_P|DA_G|DA_R|DA_W|DA_DT
ldtlen EQU $ - ldt
tss:
TRLINK dd 0
TRSTACK0 dd 0
TRSS0 dd 0
TRSTACK1 dd 0
TRSS1 dd 0
TRSTACK2 dd 0
TRSS2 dd 0
TRCR3 dd 0
TREIP dd show
TREFLAGS dd 0
TREAX dd 0
TRECX dd 0
TREDX dd 0
TREBX dd 0
TRESP dd TopOfStack
TREBP dd 0
TRESI dd 0
TREDI dd 0
TRES dd SelectorText
TRCS dd SelectorText
TRSS dd SelectorStackRPL3
TRDS dd SelectorText
TRFS dd SelectorText
TRGS dd SelectorVideo
TRLDT dd SelectorLdt
TRATTR dw 0
TRIOMAP dw 0
TRMAP db 0
tss1:
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd show
dd 0
dd 0
dd 0
dd 0
dd 0
dd TopOfStack
dd 0
dd 0
dd 0
dd SelectorText
dd SelectorText
dd SelectorStackRPL3
dd SelectorText
dd SelectorText
dd SelectorVideo
dd SelectorLdt
dw 0
dw 0
db 0
[SECTION .text]
start:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, TopOfStack
xor eax, eax
mov ax, LOADER_ADDRESS
xor edx, edx
mov dx, 0x10
mul dx
add ax, ldt
shl edx, 0x10
or edx, eax
mov eax, edx
and edx, 0xffff
mov word [ldts+2], dx
mov edx, eax
shr edx, 0x10
and edx, 0xff
mov byte [ldts+4], dl
mov edx, eax
shr edx, 24
and edx, 0xff
mov byte [ldts+7], dl
xor eax, eax
mov ax, LOADER_ADDRESS
xor edx, edx
mov dx, 0x10
mul dx
add ax, tss
shl edx, 0x10
or edx, eax
mov eax, edx
and edx, 0xffff
mov word [tsss+2], dx
mov edx, eax
shr edx, 0x10
and edx, 0xff
mov byte [tsss+4], dl
mov edx, eax
shr edx, 24
and edx, 0xff
mov byte [tsss+7], dl
xor eax, eax
mov ax, LOADER_ADDRESS
xor edx, edx
mov dx, 0x10
mul dx
add ax, tss1
shl edx, 0x10
or edx, eax
mov eax, edx
and edx, 0xffff
mov word [tsss1+2], dx
mov edx, eax
shr edx, 0x10
and edx, 0xff
mov byte [tsss1+4], dl
mov edx, eax
shr edx, 24
and edx, 0xff
mov byte [tsss1+7], dl
lgdt [gdtr]
cli
mov dx, 0x92
in al, dx
or al, 00000010b
out dx, al
mov eax, cr0
or eax, 1
mov cr0, eax
jmp SelectorCode:startcode
ReadSector:
push ax
push bx
push cx
push dx
push si
push di
mov ah, 0x00
mov dl, 0x00
int 0x13
mov ax, 19
mov dl, 0x12
div dl
add ah, 1
mov cl, ah
mov ax, 19
mov dl, 0x12
div dl
movzx ax, al
mov dl, 0x02
div dl
mov ch, al
mov dh, ah
mov dl, 0x00
mov ax, SETUP_ADDRESS
mov es, ax
mov bx, 0
mov ah, 0x02
mov al, 0x0e
re_read:
int 0x13
jc re_read
mov ax, cs
mov ds, ax
mov ax, SETUP_ADDRESS
mov es, ax
mov al, 0xe0
mov ah, 0x20
mul ah
mov bx, ax
mov dx, 0
mov di, dx
.compare:
mov cx, 11
mov si, Kernel_Filename
cld
repe cmpsb
add dx, 0x20
mov di, dx
cmp dx, bx
jnl .filename
test cx, cx
jnz .compare
.filename:
sub dx, 0x20
add dx, 0x1a
mov ax, SETUP_ADDRESS
mov ds, ax
mov si, dx
lodsw
mov di, ax
mov bx, 0
mov ax, 1
mov dl,0x12
div dl
add ah, 1
mov cl, ah
mov ax, 1
mov dl, 0x12
div dl
movzx ax, al
mov dl, 0x02
div dl
mov ch, al
mov dh, ah
mov dl, 0x00
mov ax, SETUP_ADDRESS
mov es, ax
mov bx, 0
mov ah, 0x02
mov al, 0x08
int 0x13
.begin:
cmp di, 0x0fff
jz .read
mov ax, di
mov ax, SETUP_ADDRESS
mov ds, ax
mov si, 0
mov ax, di
mov dl, 0x02
div dl
mov al, ah
cmp al, 0x00
jz .a
cmp al, 0x01
jz .b
jmp .read
.a:
mov ax, di
mov dx, 0x03
mul dx
mov cx, 0x02
div cx
mov si, ax
lodsw
and ah, 0x0f
mov si, ax
jmp .read
.b:
mov ax, di
mov dx, 0x03
mul dx
mov cx, 0x02
div cx
mov si, ax
lodsw
shr al, 0x04
and al, 0x0f
mov cl, al
shr ax, 0x04
or al, cl
mov si, ax
.read:
cmp di, 0x0fff
jz .end
mov ax, di
sub ax, 0x02
add ax, 33
mov di, ax
mov ax, di
mov dl, 0x12
div dl
add ah, 1
mov cl, ah
mov ax, di
mov dl, 0x12
div dl
movzx ax, al
mov dl, 0x02
div dl
mov ch, al
mov dh, ah
mov dl, 0x00
mov ax, KERNEL_ADDRESS
mov es, ax
mov ah, 0x02
mov al, 0x01
int 0x13
add bx, 0x200
mov di, si
jmp .begin
.end:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
LoadKernel:
push eax
push ebx
push ecx
push edx
push esi
push edi
mov ax, KERNEL_ADDRESS
mov ds, ax
mov ax, 0
mov es, ax
mov eax, 0x3c
mov ebx, dword [eax]
xor edx, edx
mov dx, word [ebx+0x06]
xor eax, eax
mov eax, dword [ebx+0x28]
mov dword [AddressOfEntryPoint], eax
xor eax, eax
mov ax, word [ebx+0x14]
add ebx, 0x04
add ebx, 0x14
add ebx, eax
.next:
mov edi, [ebx+0x0c]
mov ecx, [ebx+0x10]
mov esi, [ebx+0x14]
rep movsb
add ebx, 0x28
sub edx, 1
test edx, edx
jnz .next
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
DispAL:
push ax
push bx
push cx
push dx
mov dh, 2
mov dl, al
Disp:
mov bh, dh
sub bh, 1
mov al, bh
mov bl, 0x04
mul bl
mov cl, al
mov al, dl
shr al, cl
and al,0xf
cmp al, 10
jnl lable
add al, 0x30
jmp l
lable:
cmp al, 0xa
jz .a
cmp al, 0xb
jz .b
cmp al, 0xc
jz .c
cmp al, 0xd
jz .d
cmp al, 0xe
jz .e
cmp al, 0xf
jz .f
.a:
mov al, 'a'
jmp l
.b:
mov al, 'b'
jmp l
.c:
mov al, 'c'
jmp l
.d:
mov al, 'd'
jmp l
.e:
mov al, 'e'
jmp l
.f:
mov al, 'f'
jmp l
l:
call print
sub dh, 1
cmp dh, 0
jnz Disp
pop dx
pop cx
pop bx
pop ax
ret
print:
push ax
push bx
push cx
mov ah, 0x0e
mov bx, 0006h
mov cx, 1
int 0x10
pop cx
pop bx
pop ax
ret
[SECTION .code]
[BITS 32]
startcode:
mov ax, cs
mov ax, SelectorData
mov ds, ax
mov es, ax
mov ax, SelectorStack
mov ss, ax
mov sp, TopOfStack
mov ax, SelectorVideo
mov gs, ax
mov ax, SelectorLdt
lldt ax
mov ax, SelectorTss
ltr ax
mov al, 0x00
call clear
mov al, 'a'
call clear
mov dh, 10
mov dl, 0x00
call ShowCursor
jmp $
xor eax, eax
mov ax, SelectorStackRPL3
push eax
mov ax, sp
push esp
mov eax, SelectorText
push eax
mov eax, test
push eax
retf
jmp $
show:
mov al, 'a'
mov [gs:0], al
jmp $
test:
mov al, 'a'
mov [gs:0], al
jmp $
clear:
push eax
push ebx
push ecx
push edx
mov cl, 80
mov ch, 25
mov dl, 0
mov dh, 0
.show:
call PrintAL
add dl, 1
cmp dl, cl
jnz .show
mov dl, 0
add dh, 1
cmp dh, ch
jnz .show
pop edx
pop ecx
pop ebx
pop eax
ret
ShowAL:
push ax
push bx
push cx
push dx
mov dh, 2
mov dl, al
.disp:
mov bh, dh
sub bh, 1
mov al, bh
mov bl, 0x04
mul bl
mov cl, al
mov al, dl
shr al, cl
and al,0xf
cmp al, 10
jnl .show
add al, 0x30
jmp .l
.show:
cmp al, 0xa
jz .a
cmp al, 0xb
jz .b
cmp al, 0xc
jz .c
cmp al, 0xd
jz .d
cmp al, 0xe
jz .e
cmp al, 0xf
jz .f
.a:
mov al, 'a'
jmp .l
.b:
mov al, 'b'
jmp .l
.c:
mov al, 'c'
jmp .l
.d:
mov al, 'd'
jmp .l
.e:
mov al, 'e'
jmp .l
.f:
mov al, 'f'
jmp .l
.l:
call PrintAL
sub dh, 1
cmp dh, 0
jnz .disp
pop dx
pop cx
pop bx
pop ax
ret
PrintAL:
push eax
push ebx
push ecx
push edx
mov bl, al
xor eax, eax
mov al, dh
mov cl, 80
mul cl
xor dh, dh
add ax, dx
mov cx, 2
mul cx
xor ecx, ecx
mov cx, dx
shl ecx, 0x10
or ecx, eax
mov al, bl
mov [gs:ecx], al
pop edx
pop ecx
pop ebx
pop eax
ret
readcursor:
push ax
push bx
push cx
mov dx, 0x3d4
mov al, 0x0e
out dx, al
mov dx, 0x3d5
in al, dx
mov ch, al
mov dx, 0x3d4
mov al, 0x0f
out dx, al
mov dx, 0x3d5
in al, dx
mov cl, al
mov al, ch
mov dl, 80
mul dl
xor ch, ch
add ax, cx
mov cx, ax
mov dh, ch
mov dl, cl
pop cx
pop bx
pop ax
ret
setcursor:
push ax
push bx
push cx
mov ch, dh
mov cl, dl
mov al, ch
mov dl, 80
mul dl
xor ch, ch
add ax, cx
mov cx, ax
mov dx, 0x3d4
mov al, 0x0e
out dx, al
mov dx, 0x3d5
mov al, ch
out dx, al
mov dx, 0x3d4
mov al, 0x0f
out dx, al
mov dx, 0x3d5
mov al, cl
out dx, al
pop cx
pop bx
pop ax
ret
ShowCursor:
push ax
push bx
push cx
push dx
mov ch, dh
mov cl, dl
mov al, ch
mov dl, 80
mul dl
xor ch, ch
add ax, cx
mov cx, ax
mov dx, 0x3d4
mov al, 0x0c
out dx, al
mov dx, 0x3d5
mov al, ch
out dx, al
mov dx, 0x3d4
mov al, 0x0d
out dx, al
mov dx, 0x3d5
mov al, cl
out dx, al
pop dx
pop cx
pop bx
pop ax
ret
DispPCI:
push eax
push ebx
push ecx
push edx
mov dx, 0xcf8
xor ecx, ecx
.bus:
xor edx, edx
mov edx, PCI_BUS_MAX
shl edx, PCI_BUS_SHIFT
shl edx, 0x08
not edx
and ecx, edx
xor edx, edx
mov edx, [bus]
and edx, PCI_BUS_MAX
shl edx, PCI_BUS_SHIFT
shl edx, 0x08
or ecx, edx
.dev:
xor edx, edx
mov edx, PCI_DEVICE_MAX
shl edx, PCI_DEVICE_SHIFT
shl edx, 0x08
not edx
and ecx, edx
xor edx, edx
mov edx, [dev]
and edx, PCI_DEVICE_MAX
shl edx, PCI_DEVICE_SHIFT
shl edx, 0x08
or ecx, edx
.func:
xor edx, edx
mov edx, PCI_FUNCTION_MAX
shl edx, PCI_FUNCTION_SHIFT
shl edx, 0x08
not edx
and ecx, edx
xor edx, edx
mov edx, [func]
and edx, PCI_FUNCTION_MAX
shl edx, PCI_FUNCTION_SHIFT
shl edx, 0x08
or ecx, edx
or ecx, 0x80000000
xor eax, eax
mov eax, ecx
mov dx, 0xcf8
out dx, eax
mov dx, 0xcfc
in eax, dx
call ShowAL
jmp $
add word [func], 1
cmp word [func], PCI_FUNCTION_MAX
jnz .func
mov word [func], 0
add word [dev], 1
cmp word [dev], PCI_DEVICE_MAX
jnz .dev
mov word [func], 0
mov word [dev], 0
add word [bus], 1
cmp word [bus], PCI_BUS_MAX
jnz .bus
pop edx
pop ecx
pop ebx
pop eax
.disp:
ret
ReadPort:
push eax
push ebx
push ecx
push edx
push esi
push edi
mov ebx, 0
.read:
mov ax, SelectorData
mov es, ax
mov edi, ebp
in al, dx
stosb
add ebx, 1
cmp ecx, ebx
jnz .read
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
Kernel_Filename: db "KERNEL BIN", 0
AddressOfEntryPoint: dd 0
string: db "Hello World!", 0
address: times 256 db 0
bus: dw 0
dev: dw 0
func: dw 0
- 加载文件
- 加载文件
- 文件加载
- 加载文件javascript 文件的同步加载与异步加载
- 加载JSON文件,Plist文件
- 动态加载CSS文件
- 动态加载SCRIPT文件
- 从文件加载位图
- 加载coverage文件代码
- Java加载XML文件
- html 加载 xml 文件
- 动态加载SCRIPT文件
- 关于分散加载文件
- 动态加载资源文件
- 加载.X文件 1
- 加载php.ini文件
- 动态加载js文件
- 动态加载XAML文件
- linux交叉编译器的制作
- iOS开发网络篇—使用ASI框架进行文件下载
- 有关信号的笔记
- 复制文字到剪切板
- 安卓下的网络编程
- 加载文件
- iOS开发拓展篇—应用之间的跳转和数据传
- 机器学习3
- 树莓派连接触摸屏方法(Raspberry Pi 3.5寸 B/B+/2B LCD液晶屏)
- 安卓下的多线程
- UVa11054--Wine trading in Gergovia(贪心)
- 将数据库中大量数据以JSON格式传给JQGrid MVC4+JQGrid
- hdu1011 Starship Troopers
- Android下自动折行 效果