-2

我有这个任务来制作启动程序来显示我的电脑上的分区磁盘..我搜索了很多并发现将这些信息保存在 1BE 中的部分所以我试图从那个扇区读取..我发现了一些代码和试着研究了interrupt 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       
4

1 回答 1

0

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

于 2014-11-09T15:29:51.390 回答