引导启动程序之bootsect.s

2018-12-01  本文已影响0人  1f706595a1cd

1. P52,47~56

start :
    mov ax, #BOOTSEG             
    mov ds, ax
    mov ax, #INITSEG
    mov es, ax
    mov cx, #256
    sub si, si
    sub di, di
    rep               !  重复执行它的下一条语句movw,直到cx中的数值为0。这里是循环执行256次
    movw              !  以字节为单位,从源地址往目的地址搬移数据,si、di自增
    jmpi go,INITSEG   !  jmpi--段间跳转指令,CS = INITSEG,IP = go,即跳转到INITSEG:go处执行

标志寄存器EFlags

方向标志DF(Direction Flag),用于决定执行完一次串操作之后,变址寄存器ESI/EDI是加还是减

串操作

2. P53,62

扇区

一个扇区是512byte,setup 程序大约为 4 个扇区

段地址+偏移地址

3. P53,67

INT 0x13 磁盘服务程序
01H — 非法命令 02H — 地址目标未发现 03H — 磁盘写保护(软盘) 05H — 复位失败(硬盘)
06H — 软盘取出(软盘) 07H — 错误的参数表(硬盘) 08H — DMA越界(软盘) 09H — DMA超过64K界限
0AH — 错误的扇区标志(硬盘) 0BH — 错误的磁道标志(硬盘) 0CH — 介质类型未发现(软盘) 0DH — 格式化时非法扇区号(硬盘)
0EH — 控制数据地址目标被发现(硬盘) 0FH — DMA仲裁越界(硬盘) 10H — 不正确的CRC或ECC编码 11H — ECC校正数据错(硬盘)
20H — 控制器失败 40H — 查找失败 80H — 磁盘超时(未响应) AAH — 驱动器未准备好(硬盘)
BBH — 未定义的错误(硬盘) CCH — 写错误(硬盘) E0H — 状态寄存器错(硬盘) FFH — 检测操作失败(硬盘)

4. P54,92~102

INT 0x10

CSDN

由 BIOS 对屏幕及显示器所提供的服务程序

    ! Print some inane message
    mov ah, #0x03       ! read cursor pos,AH=0x03,读取光标,为了获取光标当前的行列
    xor bh, bh           !bh = 页号
    int 0x10               
    
    mov cx, #24
    mov bx, #0x0007     ! page 0, attribute 7 (normal)
    mov bp, #msg1
    mov ax, #0x1301     ! write string, move cursor
    int 0x10

读取光标是必要的,为了获取光标位置(DH、DL)

P55,151~155

read_it:
    mov ax, es
    test ax, #0x0fff
die:    jne die         ! es must be at 64kB boundary
    xor bx, bx         ! bx is starting address within segment

test指令

TEMP ← SRC1 AND SRC2 ;
  SF ← MSB(TEMP) ;
IF TEMP = 0
  THEN ZF ← 1 ;
  ELSE ZF ← 0 ;
  FI:
  PF ← BitwiseXNOR(TEMP[0:7]);
  CF ← 0 ;
  OF ← 0 ;

子程序151~218

实现功能

该子程序将系统模块加载到内存地址 0x10000 处,并确定没有跨越 64KB 的内存边界。我们试图尽快 地进行加载,只要可能,就每次加载整条磁道的数据

执行流程

子程序执行流图

8086寄存器

数据寄存器

指针寄存器

变址寄存器

控制寄存器

段寄存器:

上一篇 下一篇

猜你喜欢

热点阅读