汇编语言之加载器加载用户程序
2021-02-05 02:16
标签:cursor ash oop ram mamicode img screen src rect 效果图: 加载器代码: 用户程序代码: 汇编语言之加载器加载用户程序 标签:cursor ash oop ram mamicode img screen src rect 原文地址:https://www.cnblogs.com/SunShine-gzw/p/14370483.html lbr_start equ 100
SECTION mbr align=16 vstart=0x7c00
mov ax,0
mov ss,ax
mov sp,ax
mov ax,[cs:phy_base]
mov dx,[cs:phy_base+0x02]
mov bx,16
div bx
mov ds,ax
mov es,ax
xor di,di
mov si,lbr_start
xor bx,bx
call read_hard_disk
mov ax,[0]
mov dx,[2]
mov bx,512
div bx
cmp dx,0
jnz next
dec ax
next:
cmp ax,0
jz direct
push ds
mov cx,ax
continue_read:
mov ax,ds
add ax,0x20
mov ds,ax
inc si
xor bx,bx
call read_hard_disk
loop continue_read
pop ds
direct:
mov ax,[0x06]
mov dx,[0x08]
call my_segment
mov [0x06],ax
mov cx,[0x0a]
mov bx,0x0c
remalloc:
mov ax,[bx]
mov dx,[bx+0x02]
call my_segment
mov [bx],ax
add bx,4
loop remalloc
jmp far [0x04]
read_hard_disk:
push ax
push bx
push cx
push dx
mov dx,0x1f2
mov al,1
out dx,al
inc dx
mov ax,si
out dx,al
inc dx
mov al,ah
out dx,al
inc dx
mov ax,di
out dx,al
inc dx
mov al,0xe0
out dx,al
inc dx
mov al,0x20
out dx,al
waits:
in al,dx
and al,0x88
cmp al,0x08
jnz waits
mov cx,256
mov dx,0x1f0
reads:
in ax,dx
mov [bx],ax
add bx,2
loop reads
pop dx
pop cx
pop bx
pop ax
ret
my_segment:
push bx
add ax,[cs:phy_base]
adc dx,[cs:phy_base+0x02]
mov bx,16
div bx
pop bx
ret
phy_base dd 0x10000
times 510-($-$$) db 0
db 0x55,0xaa
SECTION header vstart=0
program_length dd program_end
code_entry dw start
dd section.code.start
segment_count dw (segment_end-segment_start)/4
segment_start:
code_segment dd section.code.start
data_segment dd section.data.start
stack_segment dd section.stack.start
segment_end:
SECTION code align=16 vstart=0
put_string:
mov cl,[bx]
or cl,cl
jz exit
call put_char
inc bx
jmp put_string
exit:
ret
put_char:
push ax
push bx
push cx
push dx
push ds
push es
mov dx,0x3d4
mov al,0x0e
out dx,al
mov dx,0x3d5
in al,dx
mov ah,al
mov dx,0x3d4
mov al,0x0f
out dx,al
mov dx,0x3d5
in al,dx
mov bx,ax
cmp cl,0x0d
jnz jump_one
mov ax,bx
mov bl,80
div bl
mul bl
mov bx,ax
jmp set_cursor
jump_one:
cmp cl,0x0a
jnz jump_two
add bx,80
jmp roll_screen
jump_two:
mov ax,0xb800
mov es,ax
shl bx,1
mov [es:bx],cl
shr bx,1
add bx,1
roll_screen:
cmp bx,2000
jl set_cursor
mov ax,0xb800
mov ds,ax
mov es,ax
cld
mov si,0xa0
mov di,0x00
mov cx,1920
rep movsw
mov bx,3840
mov cx,80
cls:
mov word[es:bx],0x0720
add bx,2
loop cls
mov bx,1920
set_cursor:
mov dx,0x3d4
mov al,0x0e
out dx,al
mov dx,0x3d5
mov al,bh
out dx,al
mov dx,0x3d4
mov al,0x0f
out dx,al
mov dx,0x3d5
mov al,bl
out dx,al
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
ret
start:
mov ax,[stack_segment]
mov ss,ax
mov sp,stack_end
mov ax,[data_segment]
mov ds,ax
mov bx,message
call put_string
jmp $
SECTION data align=16 vstart=0
message db ‘Hello World‘
db 0x0d,0x0a
db 0
data_end:
SECTION stack align=16 vstart=0
resb 256
stack_end:
SECTION trail align=16
program_end:
上一篇:springboot一些注解
下一篇:一致性 hash 算法理解与实现