引导磁盘分区

时间:2014-11-09 10:18:17

标签: assembly nasm boot bios sector

我有这个任务来制作启动程序,显示我的电脑上的分区磁盘..  我搜索了很多,并想出了那个在1BE中隐藏这些信息的部分,所以我试图从那个部门读取..我找到了一些代码并试图研究中断13这段代码我不知道我觉得那里是错的

然后我用NASM运行它 它显示错误无法识别的指令ORG

非常感谢:) :) :)

[BITS 16]                            ; 16 bit code generation
[ORG 0x7C00]                          ; Origin location

; Main program
main:                         ; Label for the start of the main program


start: 
       mov ax,cs
       mov ds,ax
       mov es,ax
       mov ss,ax
       sti

reset: mov ah,0h                  ;resetting the drive to the first sector
       mov dl, 0x80
       int 13h
       js reset

read:  mov ax,1BEh              ;reading sectors into memory address 0x1BE:0
       mov es,ax
       xor bx,bx
       mov ah,02h
       mov al,01h               ;reading 1 sector
       mov  cx, 0001h           ; track 0, sector 1
       mov  dx, 0000h           ; head 0, drive 0
       int 13h

      jc   errp                ; detect error
      ret




          jmp $            ; Never ending loop

; Procedures
errp:                          ; process error here
 mov ax,0x0000          
 mov ds,ax  
 mov si, ERRR                 ; Load the string into position for the procedure.
 call PutStr



PutStr:     ; Procedure label/start
                ; Set up the registers for the interrupt call
 mov ah,0x0E    ; The function to display a chacter (teletype)
 mov bh,0x00    ; Page number
 mov bl,0x07    ; Normal text attribute

.nextchar   
 lodsb  

 or al,al           
 jz .return         
 int 0x10   ; Run the BIOS video interrupt 

 jmp .nextchar  ; Loop back round tothe top
.return     ; Label at the end to jump to when complete
 ret        ; Return to main program

; Data

ERRR db 'ERROOOORR',13,10,0

; End Matter
times 510-($-$$) db 0   
dw 0xAA55       

1 个答案:

答案 0 :(得分:0)

使用ORG 0x7C00这一事实意味着您将段寄存器设置为零而不是CS中已有的值。
重置驱动器的BIOS功能不会返回符号标志SF中的任何内容。然而它确实改变了进位标志CF. 分区表位于引导扇区的偏移量0x01BE处,包含4个16字节的条目 您的(当前未使用的)READ函数可以在内存中的任何位置使用扇区大小的缓冲区,但我建议远离0x7C00处的512字节。
您是否注意到您正在重置第一个硬盘但是您正在读取第一个软盘? 我认为您打算在jmp $ ; Never ending loop之后写下call PutStr吗? 如果练习是关于显示可用的分区,那么您所要做的就是显示每个分区表条目中的CHS值,除非系统指示符字节读取0表示没有分区。