Я думал, что начинаю понимать, что происходит, но я трачу целую вечность, пытаясь понять, почему не работает следующее:
org 0x7C00
mov ax,0x0000
mov ds,ax
mov si, HelloWorld
HelloWorld db 'Hello World',13,10,0
Я ожидаю, что инструкция mov si, HelloWorld
поместит значение 0x7C08
в si
(то есть 0x7c00
+ смещение HelloWorld
), готовое для таких вещей, как lodsb
.
Когда я строю это (используя Nasm) и запускаю его (используя Bochs), я обнаруживаю, что инструкция завершения действительно выглядит так:
mov si, 0x8400
Почему это так и откуда взято значение 0x8400
?
Обновление: Я обнаружил, что размещение HelloWorld
в сегменте данных дает ожидаемый результат:
section .data
HelloWorld db 'Hello World',13,10,0
Почему это?
К вашему сведению, команда, использованная для построения, это nasm -f bin input.asm -o output.bin
Обновление 2 Я подсчитал, что 0x8400
равно 0x7c00 + 0x0800
, где 8 - смещение HelloWorld
от начала вывода - я заметил это, когда заметил, что при использовании org 0
используемый адрес 0x0800
.
Я до сих пор не понимаю, что происходит, - обнаружение этого только запутало меня!
По запросу, разборка с использованием ndisasm
:
00000000 B80000 mov ax,0x0
00000003 8ED8 mov ds,ax
00000005 BE0084 mov si,0x8400
00000008 48 dec ax
00000009 656C gs insb
0000000B 6C insb
0000000C 6F outsw
0000000D 20576F and [bx+0x6f],dl
00000010 726C jc 0x7e
00000012 640D0A00 fs or ax,0xa