Nic nie ma opadać tylko szukać trzeba w gugielu.
Masa zbędnego kodu jest u ciebie, to od początku.
Główny błąd jest tu mov ax, 0x7c00 ; segmenty... i tu org 7c00h
Otóż adres absolutny w rmode to się liczy segment * 16 + offset i co tu nam wyjdzie?
Sprawdźmy.
Kopiuj
Disassembly of section .data:
00000000 <.data>:
0: b8 00 7c mov ax,0x7c00 ; tu pacz
3: 8e d8 mov ds,ax
5: 8e c0 mov es,ax
7: b8 50 00 mov ax,0x50
a: 8e d0 mov ss,ax
c: bc 00 00 mov sp,0x0
f: eb 10 jmp 0x21
11: 50 push ax
12: 56 push si
13: ac lods al,BYTE PTR ds:[si]
14: 3c 00 cmp al,0x0
16: 74 06 je 0x1e
18: b4 0e mov ah,0xe
1a: cd 10 int 0x10
1c: eb f5 jmp 0x13
1e: 5e pop si
1f: 58 pop ax
20: c3 ret
21: be 29 7c mov si,0x7c29 ; tu pacz < -- to powoduje org
24: e8 ea ff call 0x11
27: fa cli
28: f4 hlt
29: 48 dec ax
2a: 65 6c gs ins BYTE PTR es:[di],dx
2c: 6c ins BYTE PTR es:[di],dx
2d: 6f outs dx,WORD PTR ds:[si]
2e: 21 21 and WORD PTR [bx+di],sp
30: 21 21 and WORD PTR [bx+di],sp
32: 31 31 xor WORD PTR [bx+di],si
34: 31 6f 6e xor WORD PTR [bx+0x6e],bp
37: 65 6f outs dx,WORD PTR gs:[si]
39: 6e outs dx,BYTE PTR ds:[si]
3a: 65 6f outs dx,WORD PTR gs:[si]
3c: 6e outs dx,BYTE PTR ds:[si]
3d: 65 0d 0a 00 gs or ax,0xa
...
1fd: 00 55 aa add BYTE PTR [di-0x56],dl
czyyli segment = 0x7c00, offset = 0x7c29
Kopiuj
$python
>>> hex((0x7c00*16) + 0x7c29)
'0x83c29'
no, nieco za dużo, to trzeba już w pmode robić.
Skorygowany kod.
Kopiuj
start:
; set segments
mov ax, 0x07c0
mov ds, ax
mov es, ax
; set stack
mov ax, 0x0050
mov ss, ax
mov sp, 0x0000
jmp loopy_loop
print_string:
push ax
push si
.loop_char:
lodsb
cmp al, 0x0
je .done
mov ah, 0xe
int 0x10
jmp .loop_char
.done:
pop si
pop ax
ret
loopy_loop:
mov si, hello_hello
call print_string
cli
hlt
hello_hello db "Hello!!!!111oneoneone", 13, 10, 0
times 510 - ($ - start) db 0
db 0x55
db 0xAA
Przy poprawnym kodzie, offset absolutny wyjdzie nam '0x7c29', czyli jest oke.