请注意,我是一个带引导加载程序和汇编的菜鸟,所以我一直在关注一些(可能不是最好的)示例。 我正在NASM为一个项目编写一个bootloader。它只是在屏幕上打印一个字符串并等待Enter键。输入后,它加载另一个扇区并打印第二个字符串。在VBox中进行测试非常棒:打印字符串并且一切正常。
在真正的计算机上测试后,而不是第一个字符串,我得到了垃圾。第二个程序工作正常。 我正在使用自定义脚本写入软盘。全部在Linux Mint下完成。 对不起任何错误。
org 7c00h
start:
jmp short begin ; jump over the DOS boot record data
;----------------------------------------------------------------------
; data portion of the "DOS BOOT RECORD"
; ----------------------------------------------------------------------
;DOS data goes here
;------------------------------------------------------------------------
mesaj db "Some string here" ,10
len equ $-mesaj
begin:
mov ah, 0
mov al, 03h
int 10h
mov ah, 13h
mov al, 0
mov cx, len
mov bh, 0h
mov bl, 02h
mov bp, mesaj
mov dl, 20
mov dh, 12
int 10h ;printing the string
read:
xor ah, ah
int 16h ; read a key from keyboard
cmp al, 0
jz read ; if special key, continue reading
mov ah, 0Ah
mov cx, 100
mov bh, 0
int 10h ; write keyboard character to screen
cmp al, 0dh ; if character is Enter, load second program
jne read
; loading the second sector
mov ax, 0x500
mov es, ax
mov al, 1
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
xor bx, bx
mov ah, 2
int 0x13
jmp 0x500:0
答案 0 :(得分:0)
感谢mbratch的评论,我设法让它发挥作用。由于es
未设置,es:bp
不指向我的字符串,而是指向内存中的某个随机位置。
答案是将es
设置为0,因为我正在使用绝对地址(即7c00h)。仅当开头有org 7c00h
时才有效。如果您不希望/不能使用org
将es
设置为7c0h
。
所以,要么:
org 7c00h
mov ax, 0
mov es, ax
或:
mov ax, 7c0h
mov es, ax
我从http://wiki.osdev.org/Babystep2获得了信息,并从mbratch获得了这个想法。