| 
 | 
 
 
发表于 2021-11-23 20:46:24
|
显示全部楼层
 
 
 
read.s 
-     .code16
 
 -     .globl  _start
 
 - _start:
 
 -     lgdtw   gdtr + 0x7c00
 
  
-     # 打开A20地址线
 
 -     inb     $0x92, %al
 
 -     orb     $0x02, %al
 
 -     outb    %al, $0x92
 
  
-     cli         # bootsect不打算建立保护模式下的中断机制
 
  
-     # 进入保护模式
 
 -     movl    %cr0, %eax
 
 -     orl     $1, %eax
 
 -     movl    %eax, %cr0
 
 -     ljmpl   $8, $flush + 0x7c00
 
  
-     .code32
 
 - flush:
 
 -     movw    $16, %ax
 
 -     movw    %ax, %ds
 
 -     movw    %ax, %es
 
 -     movw    %ax, %fs
 
 -     movw    %ax, %gs
 
 -     movw    %ax, %ss
 
 -     movl    $0xa0000, %esp
 
  
-     movl    %esp, %ebp
 
 -     subl    $512, %esp
 
 -     subl    $8, %esp
 
  
-     leal    -512(%ebp), %eax
 
 -     movl    $100, %ebx
 
 -     movl    %eax, (%esp)
 
 -     movl    %ebx, 4(%esp)
 
 -     calll   read_sect
 
  
-     leal    -512(%ebp), %ebx
 
 -     movb    (%ebx), %al
 
 -     movb    %al, 0xb8000
 
 -     movb    1(%ebx), %al
 
 -     movb    %al, 0xb8002
 
 -     movb    2(%ebx), %al
 
 -     movb    %al, 0xb8004
 
 -     movb    3(%ebx), %al
 
 -     movb    %al, 0xb8006
 
 -     movb    4(%ebx), %al
 
 -     movb    %al, 0xb8008
 
  
-     leal    -512(%ebp), %eax
 
 -     movl    $101, %ebx
 
 -     movl    %eax, (%esp)
 
 -     movl    %ebx, 4(%esp)
 
 -     calll   read_sect
 
  
-     leal    -512(%ebp), %ebx
 
 -     movb    (%ebx), %al
 
 -     movb    %al, 0xb80a0
 
 -     movb    1(%ebx), %al
 
 -     movb    %al, 0xb80a2
 
 -     movb    2(%ebx), %al
 
 -     movb    %al, 0xb80a4
 
 -     movb    3(%ebx), %al
 
 -     movb    %al, 0xb80a6
 
 -     movb    4(%ebx), %al
 
 -     movb    %al, 0xb80a8
 
  
- 1:
 
 -     hlt
 
 -     jmp 1b
 
  
- #void read_sect(uint8_t *buf, size_t start_sect);
 
 - read_sect:
 
 -     pushl   %ebp
 
 -     movl    %esp, %ebp
 
 -     pushl   %edi
 
  
-     # 读取1个扇区
 
 -     movb    $1, %al
 
 -     movl    $0x1f2, %edx
 
 -     outb    %al, %dx
 
  
-     # 下面发送逻辑扇区号
 
 -     # 0~7
 
 -     movl    12(%ebp), %ecx
 
 -     movl    %ecx, %eax
 
 -     movl    $0x1f3, %edx
 
 -     outb    %al, %dx
 
  
-     # 8~15
 
 -     movl    %ecx, %eax
 
 -     shrl    $8, %eax
 
 -     movl    $0x1f4, %edx
 
 -     outb    %al, %dx
 
  
-     # 16~23
 
 -     movl    %ecx, %eax
 
 -     shrl    $16, %eax
 
 -     movl    $0x1f5, %edx
 
 -     outb    %al, %dx
 
  
-     # LBA28模式, 主盘
 
 -     # LBA地址24~27
 
 -     movl    %ecx, %eax
 
 -     shrl    $24, %eax
 
 -     andl    $0x0f, %eax
 
 -     orl     $0xe0, %eax
 
 -     movl    $0x1f6, %edx
 
 -     outb    %al, %dx
 
  
-     # 发送读命令
 
 -     movb    $0x20, %al
 
 -     movl    $0x1f7, %edx
 
 -     outb    %al, %dx
 
  
-     # 等待硬盘准备好
 
 - .L1:
 
 -     inb     %dx, %al
 
 -     andb    $0x88, %al
 
 -     cmpb    $0x08, %al
 
 -     jne     .L1
 
  
-     # 从硬盘读取数据
 
 -     movl    8(%ebp), %edi
 
 -     movl    $256, %ecx
 
 -     movl    $0x1f0, %edx
 
 -     cld
 
 -     rep     insw
 
  
-     popl    %edi
 
 -     popl    %ebp
 
 -     retl
 
  
-     .align  4
 
 - gdt:
 
 -     # 空描述符
 
 -     .int    0, 0
 
  
-     # 代码段描述符
 
 -     # 段基地址: 0
 
 -     # 段界限:   4GB
 
 -     .int    0x0000ffff, 0x00cf9a00
 
  
-     # 数据段描述符
 
 -     # 段基地址: 0
 
 -     # 段界限:   4GB
 
 -     .int    0x0000ffff, 0x00cf9200
 
 - gdtr:
 
 -     .short  (. - gdt - 1)
 
 -     .int    (gdt + 0x7c00)
 
 
  复制代码 
 
write.s 
-     .code16
 
 -     .globl  _start
 
 - _start:
 
 -     lgdtw   gdtr + 0x7c00
 
  
-     # 打开A20地址线
 
 -     inb     $0x92, %al
 
 -     orb     $0x02, %al
 
 -     outb    %al, $0x92
 
  
-     cli         # bootsect不打算建立保护模式下的中断机制
 
  
-     # 进入保护模式
 
 -     movl    %cr0, %eax
 
 -     orl     $1, %eax
 
 -     movl    %eax, %cr0
 
 -     ljmpl   $8, $flush + 0x7c00
 
  
-     .code32
 
 - flush:
 
 -     movw    $16, %ax
 
 -     movw    %ax, %ds
 
 -     movw    %ax, %es
 
 -     movw    %ax, %fs
 
 -     movw    %ax, %gs
 
 -     movw    %ax, %ss
 
 -     movl    $0xa0000, %esp
 
  
-     movl    %esp, %ebp
 
 -     subl    $512, %esp
 
 -     subl    $8, %esp
 
  
-     leal    -512(%ebp), %ebx
 
 -     movb    $'h', (%ebx)
 
 -     movb    $'e', 1(%ebx)
 
 -     movb    $'l', 2(%ebx)
 
 -     movb    $'l', 3(%ebx)
 
 -     movb    $'o', 4(%ebx)
 
  
-     leal    -512(%ebp), %eax
 
 -     movl    $100, %ebx
 
 -     movl    %eax, (%esp)
 
 -     movl    %ebx, 4(%esp)
 
 -     calll   write_sect
 
  
-     leal    -512(%ebp), %ebx
 
 -     movb    $'w', (%ebx)
 
 -     movb    $'o', 1(%ebx)
 
 -     movb    $'r', 2(%ebx)
 
 -     movb    $'l', 3(%ebx)
 
 -     movb    $'d', 4(%ebx)
 
  
-     leal    -512(%ebp), %eax
 
 -     movl    $101, %ebx
 
 -     movl    %eax, (%esp)
 
 -     movl    %ebx, 4(%esp)
 
 -     calll   write_sect
 
  
- 1:
 
 -     hlt
 
 -     jmp 1b
 
  
- #void write_sect(const uint8_t *buf, size_t start_sect);
 
 - write_sect:
 
 -     pushl   %ebp
 
 -     movl    %esp, %ebp
 
 -     pushl   %esi
 
  
-     # 写入1个扇区
 
 -     movb    $1, %al
 
 -     movl    $0x1f2, %edx
 
 -     outb    %al, %dx
 
  
-     # 下面发送逻辑扇区号
 
 -     # 0~7
 
 -     movl    12(%ebp), %ecx
 
 -     movl    %ecx, %eax
 
 -     movl    $0x1f3, %edx
 
 -     outb    %al, %dx
 
  
-     # 8~15
 
 -     movl    %ecx, %eax
 
 -     shrl    $8, %eax
 
 -     movl    $0x1f4, %edx
 
 -     outb    %al, %dx
 
  
-     # 16~23
 
 -     movl    %ecx, %eax
 
 -     shrl    $16, %eax
 
 -     movl    $0x1f5, %edx
 
 -     outb    %al, %dx
 
  
-     # LBA28模式, 主盘
 
 -     # LBA地址24~27
 
 -     movl    %ecx, %eax
 
 -     shrl    $24, %eax
 
 -     andl    $0x0f, %eax
 
 -     orl     $0xe0, %eax
 
 -     movl    $0x1f6, %edx
 
 -     outb    %al, %dx
 
  
-     # 发送写命令
 
 -     movb    $0x30, %al
 
 -     movl    $0x1f7, %edx
 
 -     outb    %al, %dx
 
  
-     # 等待硬盘准备好
 
 - .L1:
 
 -     inb     %dx, %al
 
 -     andb    $0x88, %al
 
 -     cmpb    $0x08, %al
 
 -     jne     .L1
 
  
-     # 把数据写入硬盘
 
 -     movl    8(%ebp), %esi
 
 -     movl    $256, %ecx
 
 -     movl    $0x1f0, %edx
 
 -     cld
 
 -     rep     outsw
 
  
-     popl    %esi
 
 -     popl    %ebp
 
 -     retl
 
  
-     .align  4
 
 - gdt:
 
 -     # 空描述符
 
 -     .int    0, 0
 
  
-     # 代码段描述符
 
 -     # 段基地址: 0
 
 -     # 段界限:   4GB
 
 -     .int    0x0000ffff, 0x00cf9a00
 
  
-     # 数据段描述符
 
 -     # 段基地址: 0
 
 -     # 段界限:   4GB
 
 -     .int    0x0000ffff, 0x00cf9200
 
 - gdtr:
 
 -     .short  (. - gdt - 1)
 
 -     .int    (gdt + 0x7c00)
 
 
  复制代码 
 
 
 |   
 
 
 
 |