【发布时间】:2013-03-29 17:19:47
【问题描述】:
我只是接近机器级 x86 编码,所以请原谅我的问题琐碎。以下代码旨在成为一个简单的引导加载程序。它将软盘的某些扇区转储到内存中,然后跳转到加载的代码。在加载的代码中,我试图从内存变量中读取,但没有成功,如 cmets 中所述。
[ORG 0]
jmp 07C0h:start ; Goto segment 07C0
start:
; Update the segment registers
mov ax, cs
mov ds, ax
mov es, ax
reset: ; Reset the floppy drive
mov ax, 0
mov dl, 0
int 13h
jc reset
read:
mov ax, 1000h ; ES:BX = 1000:0000
mov es, ax
mov bx, 0
mov ah, 2 ; Load disk data to ES:BX
mov al, 5 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!
jc read ; on error
jmp 1000h:0000 ; Jump to the program
times 510-($-$$) db 0
dw 0AA55h
; == Loaded code from second floppy sector ==
prog:
mov ah, 0x0E ; Prints a char. This one works: the '-'
mov al, '-' ; is printed.
mov bx, 0
int 10h
mov bx, 0
a:
mov al, [L1+bx] ; Should read from L1 and print out chars.
inc bx ; But it prints only white spaces. Why?
int 10h
cmp bx, 10
jz h
jmp a
cli
hlt
L1 db "0123456789" ; my string
我不明白为什么它不起作用。我非常感谢任何帮助。
【问题讨论】:
-
澄清一下,上面是一个源文件还是两个?
-
你也可以给我们实际的代码吗?缺少
h标签,没有它,此代码无法组装。 -
检查我的答案更新中的最后一句话
-
@Frunze:代码都在一个文件中。对不起
h,它是cli之前的标签,但我在帖子中删除了它以使其更小更易读,却没有注意到它被jz引用。
标签: assembly x86 nasm real-mode