【问题标题】:ASM print function using bios calls使用 bios 调用的 ASM 打印功能
【发布时间】: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


【解决方案1】:

这段代码有 2 个错误。

os_main:
 hello db "Hi!", 0
 mov si, hello
 call print
 jmp $

您已将字符串放置在程序执行路径中的标签 hello 处! CPU 将执行这 4 个字节(“H”、“i”、“!”、0),就好像它们代表指令一样。显然他们不是。因此产生了乱码。

这将起作用:

os_main:
 mov si, hello
 call print
 jmp $
 hello db "Hi!", 0

就像 fuz 在评论中写的那样,print 代码是错误的,因为它使用了错误的地址寄存器 (BX) 来匹配您的调用 (SI)。

更好地使用下一个代码:

; IN (si) OUT ()
print:
    pusha
    mov  bx, 0007h   ; BH is DisplayPage, BL is GraphicsColor
  start:
    mov  al, [si]    ; <<<<<<<<<
    cmp  al, 0 
    je   done
    mov  ah, 0x0E    ; BIOS.Teletype
    int  0x10
    inc  si          ; <<<<<<<<<
    jmp  start
  done:
    popa
    ret

; IN () OUT ()
print_nl:
    pusha
    mov  bh, 0       ; BH is DisplayPage (No need for GraphicsColor in BL)
    mov  ax, 0x0E0D  ; BIOS.Teletype CR
    int  0x10
    mov  ax, 0x0E0A  ; BIOS.Teletype LF
    int  0x10
    popa
    ret

【讨论】:

  • 感谢您的帮助,尽管它最终成为一个愚蠢的原因,它不起作用。供参考,先不要把bootloader写到软盘,先写内核……没意义,但是可以!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多