ASM寫的硬盤引導代碼

很奇怪當年寫代碼怎麼就可以瀟灑到一句註釋都不寫?查了一下手冊才記起來,當年爲了能在C盤和D盤的兩個操作系統間自由切換引導才寫了這東東,用途是啓動系統時按住右CTRL鍵自動切換爲第二主分區引導系統,按住SHIFT鍵則直接跳過硬盤引導。

 

code segment
 assume cs:code
 org  100h
start:
 push cs
 pop  ds
 push cs
 pop  es
 mov  ax, 201h
 mov  cx, 1
 mov  dx, 80h
 mov  bx, offset buffer
 int  13h
 jc  err

 xor  ax, ax
 mov  cx, 0e0h
 mov  di, offset buffer
 rep  stosw

 mov  si, offset MbrBegin
 mov  di, offset buffer
 mov  cx, (MbrEnd - MbrBegin + 1) shr 1
 rep  movsw

 mov  ax, 301h
 mov  cx, 1
 mov  dx, 80h
 mov  bx, offset buffer
 int  13h

err:
 mov  ax, 4c00h
 int  21h
 buffer db 200h dup (0)

 org  600h
MbrBegin:
 xor  cx, cx
 mov  ss, cx
 mov  sp, 7c00h
 sti
 mov  ds, cx
 mov  es, cx
 cld
 mov  si, 7c1ah
 mov  di, 061ah
 push cx
 push di
 mov  cl, 0f3h
 rep  movsw
 retf

 mov  ax, ds:[417h]
 test ax, 00001000b
 jnz  extboot
 test ax, 00000011b
 jnz  mbret
 test ax, 00000100b
 jz  mainboot
 mov  bp, 07ceh
 mov  byte ptr [bp], 80h
 jmp  check

extboot:
 mov  ax, 202h
 mov  cx, 2
 mov  dx, 80h
 mov  bx, 7c00h
 jmp  callint

mainboot:
 xor  ax, ax
 mov  si, 07beh
 mov  cl, 4

loopfind:
 cmp  [si], ch
 jz  $ + 5
 mov  bp, si
 inc  ax
 add  si, 10h
 loop loopfind

 dec  ax
 jz  check
 jnl  error1
mbret:
 int  18h

check:
 mov  dx, [bp]
 cmp  dl, 80h
 jnz  error1

diskread:
 mov  ah, 41h
 mov  bx, 55aah
 int  13h
 cmp  bx, 0aa55h
 mov  bx, 7c00h
 jnz  diskread2
 shr  cl, 1
 jnc  diskread2

 xor  ax, ax
 push ax     ;+e
 push ax     ;+c
 push word ptr [bp + 0ah] ;+a
 push word ptr [bp + 8] ;+8
 push ax     ;+6
 push bx     ;+4
 inc  ax
 push ax     ;+2
 mov  al, 10h
 push ax     ;+0
 mov  si, sp
 mov  ah, 42h
 jmp  callint

error1:
 mov  si, offset msg1
 jmp  $ + 5

error2:
 mov  si, offset msg2
 jmp  $ + 5

error3:
 mov  si, offset msg3
 call print
 jmp  $

diskread2:
 mov  ax, 201h
 mov  cx, [bp + 2]

callint:
 int  13h
 jc  error2
 cmp  word ptr ds:[7dfeh], 0aa55h
 jnz  error3
 db  0eah, 00h, 7ch, 00h, 00h ;jmp  0000:7c00

loopprint:
 mov  ah, 0eh
 mov  bx, 0007h
 int  10h

print:
 lodsb
 test al, al
 jnz  loopprint
 ret

msg1 db "Invalid partition table", 0
msg2 db "Error loading operating system", 0
msg3 db "Missing operating system", 0, 0
MbrEnd:
code ends
end start

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章