Du tilgår hukommelsen i en linear facon ved bruge af pointere:
char *videoMemory = (char *)0xb8000;
Det er 32 bit flat memory kode.
16 bit kode kræver brugen af segment registre og et offset, hvilke du ikke rigtig kan modellere i C.
gcc kan ikke generere kode til segmented memory model.
Og by the way, så ligger videohukommelsen på 0xb800, ikke 0xb8000.
Her er den assembly kode som gcc genererer for print() funktionen:
print:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 753664
mov DWORD PTR [ebp-8], 0
mov edx, DWORD PTR [ebp+12]
mov eax, edx
sal eax, 2
add eax, edx
sal eax, 5
mov DWORD PTR [ebp-8], eax
jmp .L2
.L4:
mov eax, DWORD PTR [ebp+8]
movzx eax, BYTE PTR [eax]
cmp al, 10
jne .L3
add DWORD PTR [ebp+12], 1
mov edx, DWORD PTR [ebp+12]
mov eax, edx
sal eax, 2
add eax, edx
sal eax, 5
mov DWORD PTR [ebp-8], eax
add DWORD PTR [ebp+8], 1
jmp .L2
.L3:
mov eax, DWORD PTR [ebp-8]
mov edx, DWORD PTR [ebp-4]
add edx, eax
mov eax, DWORD PTR [ebp+8]
movzx eax, BYTE PTR [eax]
mov BYTE PTR [edx], al
add DWORD PTR [ebp+8], 1
add DWORD PTR [ebp-8], 1
mov eax, DWORD PTR [ebp-8]
mov edx, DWORD PTR [ebp-4]
lea eax, [edx+eax]
mov BYTE PTR [eax], 7
add DWORD PTR [ebp-8], 1
.L2:
mov eax, DWORD PTR [ebp+8]
movzx eax, BYTE PTR [eax]
test al, al
jne .L4
mov eax, 1
leave
ret