bochs nasm linux0.00 0x10000 dd

bochs nasm linux0.00 0x10000 dd 这个题目真的是!

对了把运行效果图贴在前面一张,显摆显摆!

上一篇发的不过瘾,所以这次又补了一个,这次是四个任务!

注: 为了节约时间,代码的部分是从网上拷贝下来了的,自己改的部分也很拙劣,望诸位请见谅!

所需要的软件:

bochs:                         https://jaist.dl.sourceforge.net/project/bochs/bochs/2.6.8/Bochs-2.6.8.exe

nasm:                          https://www.nasm.us/pub/nasm/releasebuilds/2.14rc15/win64/nasm-2.14rc15-installer-x64.exe

dd(win):                       http://www.chrysocome.net/downloads/ee48819f687ea45e1b76fef8a83adce7/dd-0.6beta3.zip

安装方法:(不好意思,这个省略了,不要告诉我不会呀!)

dd不用安装解压后复制到nasm目录就行了。

安装好后设置环境变量:

是吧nasm安装目录,bochs安装目录设置为默认的命令,目的下面的auto命令能够顺利执行,还有就是bochs中制作影响文件的bximage在任何地方都能用。

再贴一个制作a.img 的图好了

###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=../BIOS-bochs-latest
vgaromimage: file=../VGABIOS-lgpl-latest

# what disk images will be used 
floppya: 1_44=a.img, status=inserted
##floppyb: 1_44=floppyb.img, status=inserted

# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
##ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17

# choose the boot disk.
boot: floppy

# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx

#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga

# where do we send log messages?
log: bochsout.txt

# disable the mouse, since DLX is text only
mouse: enabled=0

# set up IPS value and clock sync
cpu: ips=15000000
clock: sync=both

# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so 
# in the DLX Linux example I'm enabling keyboard_mapping so that paste 
# will work.  Cut&Paste is currently implemented on win32 and X windows only.

keyboard: keymap=../keymaps/x11-pc-us.map
#keyboard: keymap=../keymaps/x11-pc-fr.map
#keyboard: keymap=../keymaps/x11-pc-de.map
#keyboard: keymap=../keymaps/x11-pc-es.map
 

boot.s

bootseg equ 0x07c0
sysseg equ 0x1000
syslen equ 17
start:
    jmp bootseg:go
go:
    mov ax,cs
    mov ds,ax
    mov ss,ax
    mov sp,0x0400
 
load_syetem:
    mov dx,0x0000
    mov cx,0x0002
    mov ax,sysseg
    mov es,ax
    xor bx,bx
    mov ax,0x200+syslen
    int 0x13
    jnc ok_load
die:
    jmp die
 
ok_load:
    cli

 
    mov ax,bootseg
    mov ds,ax
    lidt [idt_48]
    lgdt [gdt_48]
    
    
    mov al, 0x11
    out 0x20, al
    out 0xa0, al
    mov al, 0x20
    out 0x21, al
    mov al, 0x28
    out 0xa1, al
    mov al, 0x4
    out 0x21, al
    mov al, 0x2
    out 0xa1, al
    mov al, 0x1
    out 0x21, al
    out 0xa1, al
    mov al, 0xff
    out 0x21, al
    out 0xa1, al
    
    
    
    mov ax,0x0001
    lmsw ax
    jmp 8:0
 
gdt:
    dw 0,0,0,0
    dw 0x07ff
    dw 0x0000
    dw 0x9a01
    dw 0x00c0
    
    dw 0x07ff
    dw 0x0000
    dw 0x9201
    dw 0x00c0
 
idt_48:
    dw 0,0,0
gdt_48:
    dw 0x7ff
    dw 0x7c00+gdt,0
    times 510-($-$$) db 0
    dw 0xaa55
 

head.s

LATCH equ 11930
SCRN_SEL equ 0x18
TSS0_SEL equ 0x20
LDT0_SEL equ 0x28
TSS1_SEL equ 0x30
LDT1_SEL equ 0x38

bits 32

startup_32:
    mov eax,0x10
    mov ds,ax
    lss esp,[init_stack]
    
    
    ;setup base fields of descriptors.
    
    mov ebx, 0x10000
    mov ecx, gdt
    lea eax, [tss0]
    mov edi, 0x20
    
    call set_base
    
    lea eax, [ldt0]
    mov edi, 0x28
    
    call set_base
    
    lea eax, [tss1]
    mov edi, 0x30
    
    call set_base
    
    lea eax, [ldt1]
    mov edi, 0x38
    
    call set_base
    
    lea eax, [tss2]
    mov edi, 0x40
    
    call set_base
    
    lea eax, [ldt2]
    mov edi, 0x48
    
    call set_base
    
    lea eax, [tss3]
    mov edi, 0x50
    
    call set_base
    
    lea eax, [ldt3]
    mov edi, 0x58
    
    call set_base
    
 
    call setup_idt
    call setup_gdt
    mov eax,dword 0x10
    mov ds,ax
    mov es,ax
    mov fs,ax
    mov gs,ax
    lss esp,[init_stack]
 
    ; setup timer 8253 chip.
    mov al,0x36
    mov edx,0x43
    out dx,al
    mov eax,LATCH
    mov edx,0x40
    out dx,al
    mov al,ah
    out dx,al
 
    ;setup timer and system interrupt descriptors.
    
    mov eax,0x00080000
    mov ax,timer_interrupt
    mov dx,0x8e00
    mov ecx,0x20
    lea esi,[idt+ecx*8]
    mov [esi],eax
    mov [esi+4],edx
    mov ax,system_interrupt
    mov dx,0xef00
    mov ecx,0x80
    lea esi,[idt+ecx*8]
    mov [esi],eax
    mov [esi+4],edx
    
    
    ;unmask the timer interrupt.
    
    mov edx, 0x21
    in al, dx
    and al, 0xfe
    out dx, al
    
    ; move to user mode (task0)
    pushf
    and dword[esp],0xffffbfff
    popf
    mov eax,0x20
    ltr ax
    mov eax,0x28
    lldt ax
    mov dword[current],0
    sti
    push long 0x17
    push long usr_stk0
    pushf
    push long 0x0f
    push long task0
    iret
 
setup_gdt:
    lgdt [lgdt_opcode]
    ret
setup_idt:
    lea edx,[ignore_int]
    mov eax,0x80000
    mov ax,dx
    mov dx,0x8e00
    lea edi,[idt]
    mov ecx,256
rp_idt:
    mov [edi],eax
    mov [edi+4],edx
    add edi,8
    dec ecx
    jne rp_idt
    lidt [lidt_opcode]
    ret
    
    
set_base:
    add eax, ebx
    add edi, ecx
    mov [edi + 2], ax
    ror eax, 16
    mov [edi + 4], al
    mov [edi + 7], ah
    ror eax, 16
    ret
 
write_char:
    push gs
    push ebx
    push eax
    mov ebx,SCRN_SEL
    mov gs,bx
    mov bx,[scr_loc]
    shl ebx,1
    mov [gs:ebx],ax
    shr ebx,1
    inc ebx
    cmp ebx,2000
    jb .l1
    mov ebx,0
.l1:
    mov [scr_loc],ebx
    pop eax
    pop ebx
    pop gs
    ret
 
align 4
ignore_int:
    push ds
    push eax
    mov eax,0x10
    mov ds,ax
    mov eax,'H'
    mov ah, 0xC
    call write_char
    pop eax
    pop ds
    iret
 
align 4
timer_interrupt:
    push ds
    push eax
    push ebx
    push ecx
    push edx
    
    mov eax,0x10
    mov ds,ax
    mov al,0x20
    out 0x20,al

    cmp dword [current],0x0
    je entry0
    cmp dword [current],0x1
    je entry1
    cmp dword [current],0x2
    je entry2
    cmp dword [current],0x3
    je entry3
    jmp int_end

entry0:
    mov dword[current], 0x1
    jmp 0x30:0
    jmp int_end
    
entry1:
    mov dword[current], 0x2
    jmp 0x40:0
    jmp int_end    
entry2:
    mov dword[current], 0x3
    jmp 0x50:0
    jmp int_end
    
entry3:
    mov dword[current], 0x0
    jmp 0x20:0
    jmp int_end
    
int_end:
    pop edx
    pop ecx
    pop ebx
    pop eax
    pop ds
    iret
 
align 4
system_interrupt:
    push ds
    push edx
    push ecx
    push ebx
    push eax
    mov edx,0x10
    mov ds,dx
    call write_char
    pop eax
    pop ebx
    pop ecx
    pop edx
    pop ds
    iret
 
current: dd 0
scr_loc: dd 0
 
align 4
lidt_opcode:
    dw 256*8-1
    dd idt + 0x10000
    
align 4
lgdt_opcode:
    dw (end_gdt-gdt)-1
    dd gdt + 0x10000
 
align 8
idt:
    times 256*8 db 0
gdt:
    dq 0x0000000000000000
    dq 0x00c09a01000007ff
    dq 0x00c09201000007ff
    dq 0x00c0920b80000002
    dw 0x68,tss0,0xe900,0x0
    dw 0x40,ldt0,0xe200,0x0
    dw 0x68,tss1,0xe900,0x0
    dw 0x40,ldt1,0xe200,0x0
    dw 0x68,tss2,0xe900,0x0  ;0x40
    dw 0x40,ldt2,0xe200,0x0  ;0x48 
    dw 0x68,tss3,0xe900,0x0  ;0x50
    dw 0x40,ldt3,0xe200,0x0  ;0x58 
end_gdt:
    times 128*4 db 0
init_stack:
    dd init_stack
    dw 0x10
 
align 8
ldt0:
    dq 0x0000000000000000
    dq 0x00c0fa01000003ff
    dq 0x00c0f201000003ff
tss0:
    dd 0
    dd krn_stk0,0x10
    dd 0,0,0,0,0
    dd task0,0x200
    dd 0,0,0,0
    dd usr_stk0,0,0,0
    dd 0x17,0x0f,0x17,0x17,0x17,0x17
    dd LDT0_SEL,0x8000000

 
times 128*4 db 0 
krn_stk0:
 
align 8
ldt1:
    dq 0x0000000000000000
    dq 0x00c0fa01000003ff
    dq 0x00c0f201000003ff
 
tss1:
    dd 0
    dd krn_stk1,0x10
    dd 0,0,0,0,0
    dd task1,0x200
    dd 0,0,0,0
    dd usr_stk1,0,0,0
    dd 0x17,0x0f,0x17,0x17,0x17,0x17
    dd LDT1_SEL,0x8000000
    
times 128*4 db 0
krn_stk1:

align 8
ldt2:
    dq 0x0000000000000000
    dq 0x00c0fa01000003ff
    dq 0x00c0f201000003ff
 
tss2:
    dd 0
    dd krn_stk2,0x10
    dd 0,0,0,0,0
    dd task2,0x200
    dd 0,0,0,0
    dd usr_stk2,0,0,0
    dd 0x17,0x0f,0x17,0x17,0x17,0x17
    dd 0x48,0x8000000
    
times 128*4 db 0
krn_stk2:

align 8
ldt3:
    dq 0x0000000000000000
    dq 0x00c0fa01000003ff
    dq 0x00c0f201000003ff
 
tss3:
    dd 0
    dd krn_stk3,0x10
    dd 0,0,0,0,0
    dd task3,0x200
    dd 0,0,0,0
    dd usr_stk3,0,0,0
    dd 0x17,0x0f,0x17,0x17,0x17,0x17
    dd 0x58,0x8000000
    
times 128*4 db 0
krn_stk3:


task0:
    mov eax,0x17
    mov ds,ax
    mov ah, 0xb
    mov al, '0'
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
;    mov al,'H'
;    mov ah, 0xe
;    int 0x80
;    mov al,'e'
;    int 0x80    
;    mov al, 39  
;    int 0x80
;    mov al,'s'
;    int 0x80    
;    mov al,' '
;    int 0x80
;    mov al,'c'
;    int 0x80
;    mov al,'r'
;    int 0x80
;    mov al,'a'
;    int 0x80
;    mov al,'z'
;    int 0x80
;    mov al,'y'
;    int 0x80
;    mov al,' '
;    int 0x80
    mov ecx,0xfffff
.l1:
    loop .l1
    jmp task0
    
times 128*4 db 0
usr_stk0:
 
task1:
;    mov al,' '
;    mov ah, 0xb
;    int 0x80
;    mov al,'i'
;    int 0x80
;    mov al,'s'
;    int 0x80
;    mov al,'n'
;    int 0x80
;    mov al,39
;    int 0x80
;    mov al,'t'
;    int 0x80
;     mov al,' '
;    int 0x80
;    mov al,'h'
;    int 0x80
;    mov al,'e'
;    int 0x80
;    mov al,'?'
;    int 0x80
    mov ah, 0xa
    mov al, '1'
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov ecx,0xfffff
.l2:
    loop .l2
    jmp task1
 
times 128*4 db 0
usr_stk1:


task2:
    mov eax,0x17
    mov ds,ax
    mov al,'2'
    mov ah, 0xf
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov ecx,0xfffff
here2:
    loop here2
    jmp task2
    
times 128*4 db 0
usr_stk2:


task3:
    mov eax,0x17
    mov ds,ax
    mov al,'3'
    mov ah, 0x9
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov al,' '
    mov ah, 0x0
    int 0x80
    mov ecx,0xfffff
here3:
    loop here3
    jmp task3
    
times 128*4 db 0
usr_stk3:

自己写的批处理文件,auto.cmd

@echo off

nasm -fbin -o boot.bin boot.s
dd if=boot.bin of=a.img
nasm -fbin -o head.bin head.s
dd if=head.bin of=a.img seek=1 count=17
copy a.img "C:\Program Files (x86)\Bochs-2.6.9\dlxlinux\a.img"

运行效果

猜你喜欢

转载自blog.csdn.net/weixin_39410618/article/details/81248581