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