1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
i386: 0.981
boot: 0.949
assembly: 0.936
graphic: 0.838
files: 0.836
device: 0.835
debug: 0.799
performance: 0.793
architecture: 0.771
mistranslation: 0.735
semantic: 0.733
kernel: 0.730
virtual: 0.649
peripherals: 0.618
vnc: 0.618
socket: 0.608
arm: 0.592
PID: 0.573
permissions: 0.543
register: 0.529
ppc: 0.506
network: 0.474
hypervisor: 0.430
risc-v: 0.411
VMM: 0.409
user-level: 0.391
TCG: 0.342
x86: 0.325
KVM: 0.265
int 0x10 teletype output cuts final character in custom MBR on QEMU (i386 real mode)
Description of problem:
When using QEMU to test a custom bootloader in 16-bit real mode (i386), the BIOS interrupt `int 0x10` with AH=0x0E (teletype output) fails to display the last character of the printed message. For example, printing `"hello"` only renders `"hell"`.
This happens only with this exact combination:
real mode `int 0x10` teletype output
message ends with `13, 10, 0`
`QEMU` output cuts off the last character consistently
All buffer and code logic has been verified to be correct. The same code, when run on Bochs or physical hardware, prints properly.
Steps to reproduce:
1.Assemble the following boot.asm:
```nasm
[org 0x7C00]
[BITS 16]
_start:
cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
mov si, msg
call print
hlt
jmp $
print:
pusha
.loop:
lodsb
or al, al
jz .done
mov ah, 0x0E
int 0x10
jmp .loop
.done:
popa
ret
msg db 'hello', 13, 10, 0
times 510 - ($ - $$) db 0
dw 0xAA55
```
2. Compile and run:
```bash
$ nasm -f bin boot.asm -o boot.img
$ qemu-system-i386 -nographic -boot a -drive format=raw,file=boot.img,index=0,if=floppy
```
3. Output will be:
```text
Booting from Floppy...
hell
```
Expected output:
```text
Booting from Floppy...
hello
```
Additional information:
- Adding padding (extra 13, 10) does not solve the problem.
- Confirmed that boot.img includes all bytes (xxd dump is correct).
- Tested on multiple machines with same QEMU version.
- May relate to VGA character output buffer not flushing after last INT 0x10?
- This makes QEMU inaccurate for BIOS-level debugging of bootloaders.
|