当前位置: 代码迷 >> 汇编语言 >> 高人帮忙解释上 不胜感激
  详细解决方案

高人帮忙解释上 不胜感激

热度:4813   发布时间:2013-02-26 00:00:00.0
高人帮忙解释下 不胜感激
/*
; * Microsoft Confidential
; * Copyright (C) Microsoft Corporation 1983 - 1991
; * All Rights Reserved.
; */
; BOOT - IBM hard disk boot record 6/8/82
;
;
; This is the standard boot record that will be shipped on all hard disks. It contains:
;
; 1. Code to load (and give control to) the boot record for 1 of 4 possible
; operating systems.
;
; 2. A partition table at the end of the boot record, followed by the required signature.
;
;

relocated_org equ 0600h
buildtime_org equ 0100h
org_delta equ (relocated_org - buildtime_org)

_data segment public
  assume cs:_data,ds:_data

;
; /tiny programs start at 100h.
;

  org buildtime_org
start:

  cli ;no interrupts for now
  xor ax,ax
  mov ss,ax
  mov sp,7c00h ;new stack at 0:7c00
  mov si,sp ;where this boot record starts - 0:7c00
  push ax
  pop es ;seg regs the same
  push ax
  pop ds
  sti ;interrupts ok now
  cld
  mov di,relocated_org ;where to relocate this boot record to
  mov cx,100h
  rep movsw ;relocate to 0:0600
; jmp entry2 + org_delta
  db 0eah
  dw $+4+org_delta,0
entry2:
  mov si,(offset tab) + org_delta ;partition table
  mov bl,4 ;number of table entries
next:
  cmp byte ptr[si],80h ;is this a bootable entry?
  je boot ;yes
  cmp byte ptr[si],0 ;no, is boot indicator zero?
  jne bad ;no, it must be x"00" or x"80" to be valid
  add si,16 ;yes, go to next entry
  dec bl
  jnz next
  int 18h ;no bootable entries - go to rom basic
boot:
  mov dx,[si] ;head and drive to boot from
  mov cx,[si+2] ;cyl, sector to boot from
  mov bp,si ;save table entry address to pass to partition boot record
next1:
  add si,16 ;next table entry
  dec bl ;# entries left
  jz tabok ;all entries look ok
  cmp byte ptr[si],0 ;all remaining entries should begin with zero
  je next1 ;this one is ok
bad:
  mov si,(offset m1) + org_delta ;oops - found a non-zero entry - the table is bad
msg:
  lodsb ;get a message character
  cmp al,0
  je hold
  push si
  mov bx,7
  mov ah,14
  int 10h ;and display it
  pop si
  jmp msg ;do the entire message
;
hold: jmp hold ;spin here - nothing more to do
tabok:
  mov di,5 ;retry count
rdboot:
  mov bx,7c00h ;where to read system boot record
  mov ax,0201h ;read 1 sector
  push di
  int 13h ;get the boot record
  pop di
  jnc goboot ;successful - now give it control
  xor ax,ax ;had an error, so
  int 13h ;recalibrate
  dec di ;reduce retry count
  jnz rdboot ;if retry count above zero, go retry
  mov si,(offset m2) + org_delta ;all retries done - permanent error - point to message,
  jmp msg ;go display message and loop
  相关解决方案