Почему мой машинный код не работает должным образом? - PullRequest
0 голосов
/ 03 мая 2019

Я использую отладчик DOSBox в качестве среды для изучения того, как процессор на базе x86 / 64 пересекает машинный код.

В качестве справочного материала я использую пример «Вывод с ограничением длины в DOS2», который я нашел по адресу: https://montcs.bloomu.edu/~bobmon/Information/LowLevel/Assembly/hello-asm.html

Я пробовал несколько разных подходов, но именно это дало результаты, наиболее близкие к тому, что я ищу.

Я использую шестнадцатеричный редактор для ввода байтов вручную, и вот шестнадцатеричный код, который я сейчас сохранил в файле с именем "executetable.com":

68 DD 01 1F B2 00 B6 00 B1 06 B3 01 B4 40 B0 00
CD 21 B4 4C B0 00 CD 21 48 65 6C 6C 6F 21 0A D0
0A 24 20

Выполнение этого файла через отладчик дает следующий обзор кода:

01DD:0100  68DD01              push 01DD
01DD:0103  1F                  pop  ds
01DD:0104  B200                mov  dl,00
01DD:0106  B600                mov  dh,00
01DD:0108  B106                mov  cl,06
01DD:010A  B301                mov  bl,01
01DD:010C  B440                mov  ah,40
01DD:010E  B000                mov  al,00
01DD:0110  CD21                int  21
01DD:0112  B44C                mov  ah,4C
01DD:0114  B000                mov  al,00
01DD:0116  CD21                int  21

Это несколько похоже на код в ссылке (который я, конечно, тоже пробовал) и выдает строку длины 6, как и ожидалось.
Тем не менее, строка не извлекается из того места, где я хочу, и поэтому вывод - просто беспорядок символов, в отличие от «Hello!» который присутствует в шестнадцатеричном коде.

Есть мысли о том, что происходит?

1 Ответ

2 голосов
/ 04 мая 2019

Я воссоздал пример с использованием NASM, как было предложено Питером Кордесом, который сначала дал те же результаты, что и одна из моих предыдущих попыток, но когда я добавил «org 0x100» в начало источника моей сборки, я получил результат, который искал для.

Это существенно добавляет смещение ко всем адресам, которое необходимо, поскольку код загружается в память по адресу 0x100, а не 0x00. В этом примере «org 0x100» приводил только к изменению одного бита в полученном результате, но этот один бит был разницей между чтением из памяти в правильном месте и чтением 256 байтов в раннее.

Вот как в итоге получился машинный код:

BA 13 01 B9 06 00 BB 01 00 B8 00 40 CD 21 B8 00
4C CD 21 48 65 6C 6C 6F 21

И код сборки, использованный для его создания:

org 0x100

mov dx, msg
mov cx, 0x06
mov bx, 1
mov ax, 0x4000
int 0x21
mov ax, 0x4C00
int 0x21

msg db "Hello!"
...