BIOS 中断 0x10/AH=0x13(写入字符串)的问题
Problems with BIOS interrupt 0x10/AH=0x13 (Write String)
正在为 class 开发一个简单的 hello.s,让它与 int 0x10
/AH=0x0E
一起工作
我想用 AH=0x13 简化代码,它应该打印一个字符串。但由于我不明白的原因,它不起作用。代码如下:
.code16
.global start
start:
mov $start, %sp # Put the stack beneath us
call setup # Setup BIOS modes
xor %ax, %ax
mov %ax, %es # This is already zero, but let's make that clear
mov $hello, %bp
mov $hello_len, %cx
call print # Prints Hello World
mov $hello, %bp
mov $hello_len, %cx
call print_string
call done # Halt
setup:
mov [=10=]x00, %ah # Set Video mode to:
mov [=10=]x03, %al # 80x25 Color Text Mode
int [=10=]x10 # Do it
ret
print: # This routine works
mov %bp, %si
add %bp, %cx
loop: cmp %si, %cx
jz print_end
lodsb # Load and increment source index
mov [=10=]x0E, %ah # Print single character
int [=10=]x10 # Do it
jmp loop
print_end: ret
print_string: # This routine does not work
mov [=10=]x0100, %dx # DH: Row, DL: Column
mov [=10=]x1301, %ax # AH: Write String, AL: Update Cursor
mov [=10=]x0007, %bx # BH: Page Number, BL: Color (Light Gray)
int [=10=]x10 # Do it
ret
done:
hlt
hello:
.ascii "Hello World"
hello_len = . - hello
.= 0x01FE
.byte 0x55, 0xAA
代码是 built/run 并且:
as hello.s -o hello.o
ld -N -e start -Ttext=0x7c00 hello.o -o hello.elf
objcopy -O binary hello.elf hello
qemu-system-i386 -hda hello --nographic
print
例程打印“Hello World”,print_string
例程正确移动光标但不打印任何字符。
我已经通过 GDB 验证所有段寄存器都已归零,并且尝试了明确将它们归零的变体。没有变化。知道我在这里做错了什么吗?我已经在 Seabios 源代码中验证了此中断是受支持的。
问题出在 --nographic
选项上。基于属性的输出的某些特性不允许 qemu 打印具有属性的字符串。但这不是一个完整的答案,因为 SeaBios 源暗示这两个中断如何打印到屏幕上实际上没有区别。
正在为 class 开发一个简单的 hello.s,让它与 int 0x10
/AH=0x0E
我想用 AH=0x13 简化代码,它应该打印一个字符串。但由于我不明白的原因,它不起作用。代码如下:
.code16
.global start
start:
mov $start, %sp # Put the stack beneath us
call setup # Setup BIOS modes
xor %ax, %ax
mov %ax, %es # This is already zero, but let's make that clear
mov $hello, %bp
mov $hello_len, %cx
call print # Prints Hello World
mov $hello, %bp
mov $hello_len, %cx
call print_string
call done # Halt
setup:
mov [=10=]x00, %ah # Set Video mode to:
mov [=10=]x03, %al # 80x25 Color Text Mode
int [=10=]x10 # Do it
ret
print: # This routine works
mov %bp, %si
add %bp, %cx
loop: cmp %si, %cx
jz print_end
lodsb # Load and increment source index
mov [=10=]x0E, %ah # Print single character
int [=10=]x10 # Do it
jmp loop
print_end: ret
print_string: # This routine does not work
mov [=10=]x0100, %dx # DH: Row, DL: Column
mov [=10=]x1301, %ax # AH: Write String, AL: Update Cursor
mov [=10=]x0007, %bx # BH: Page Number, BL: Color (Light Gray)
int [=10=]x10 # Do it
ret
done:
hlt
hello:
.ascii "Hello World"
hello_len = . - hello
.= 0x01FE
.byte 0x55, 0xAA
代码是 built/run 并且:
as hello.s -o hello.o
ld -N -e start -Ttext=0x7c00 hello.o -o hello.elf
objcopy -O binary hello.elf hello
qemu-system-i386 -hda hello --nographic
print
例程打印“Hello World”,print_string
例程正确移动光标但不打印任何字符。
我已经通过 GDB 验证所有段寄存器都已归零,并且尝试了明确将它们归零的变体。没有变化。知道我在这里做错了什么吗?我已经在 Seabios 源代码中验证了此中断是受支持的。
问题出在 --nographic
选项上。基于属性的输出的某些特性不允许 qemu 打印具有属性的字符串。但这不是一个完整的答案,因为 SeaBios 源暗示这两个中断如何打印到屏幕上实际上没有区别。