【发布时间】:2020-10-10 19:15:08
【问题描述】:
我正在尝试将打印功能添加到我正在编写的 ASM 内核中,尽管我尝试了很多都没有成功。大多数,比如来自osdev 的那个,简单地打印出:?,或者两张快乐的脸。我正在使用 mikeos 引导加载程序和 qemu。这是我当前的内核,它会无限打印出乱码:
%include "print.asm"
os_main:
hello db "Hi!", 0
mov si, hello
call print
jmp $
print.asm 的内容(来自教程):
print:
pusha
; keep this in mind:
; while (string[i] != 0) { print string[i]; i++ }
; the comparison for string end (null byte)
start:
mov al, [bx] ; 'bx' is the base address for the string
cmp al, 0
je done
; the part where we print with the BIOS help
mov ah, 0x0e
int 0x10 ; 'al' already contains the char
; increment pointer and do next loop
add bx, 1
jmp start
done:
popa
ret
print_nl:
pusha
mov ah, 0x0e
mov al, 0x0a ; newline char
int 0x10
mov al, 0x0d ; carriage return
int 0x10
popa
ret
这段代码有什么问题?我是汇编语言的新手,任何帮助将不胜感激。
汇编器:nasm
【问题讨论】:
-
这段代码运行时您是否仍处于实模式?它产生什么输出?这不是minimal reproducible example,不足以调试您的问题。
-
请注意,您的
print函数从bx读取字符串,但您将指向该字符串的指针放入si。您希望它如何工作?
标签: assembly nasm x86-16 bios osdev