Я использую отладчик DOSBox в качестве среды для изучения того, как процессор на базе x86/64 проходит машинный код.
В качестве справки я использую пример «вывода с разделителями длины DOS2», который я нашел по адресу: https://montcs.bloomu.edu/~bobmon/Information/LowLevel/Assembly/hello-asm.html
Я пробовал несколько разных подходов, но это то, что дало результаты, наиболее близкие к тому, что я ищу.
Я использую шестнадцатеричный редактор для ввода байтов вручную, и вот шестнадцатеричный код, который я сейчас сохранил в файле с именем «executable.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, как и ожидалось.
Однако строка не извлекается из того места, где я хочу, и поэтому вывод просто беспорядок символов в отличие от "Привет!" который присутствует в шестнадцатеричном коде.
Есть мысли о том, что происходит?
0x1dd
в ds и 0 в dx. Таким образом, ds:dx равно 1dd:0. Пробовали ли вы сделать дамп памяти в этот момент? Что-то вродеd 1dd:0
? - person David Wohlferd   schedule 03.05.2019int 21h
. (Но, конечно, одношаговое выполнениеint 21h
может быть проще, чем обход библиотечной функции-оболочки вокруг системного вызова Windows или Linux.) - person Peter Cordes   schedule 03.05.2019db 0x68, 0xdd, 0x01, ...
и ассемблировать+ссылку, чтобы в конечном итоге получить текстовый или кодовый раздел 32- или 64-битного исполняемого файла. Однако мне было проще изучить машинный код x86, написав исходный код на ассемблере и посмотрев на дизассемблирование. По сути, нет необходимости запоминать карту кода операции или писать ее от руки, чтобы изучить приемы машинного кода. - person Peter Cordes   schedule 03.05.2019nasm foo.asm
создает плоский двоичный файл, также известный как.com
по умолчанию. т. е.-f bin
является форматом вывода по умолчанию. Используйтеorg 0x100
, если вы хотите использовать символы для адресов, чтобы NASM знал, куда будет загружен код. - person Peter Cordes   schedule 03.05.2019cs:0118
, поэтому я бы предложил загрузитьds
изcs
(вместо жестко запрограммированного 01DD, что является плохой практикой и, возможно, ненадежным) иdx
с 0118 (вместо 0000, что явно неправильно). - person Ruud Helderman   schedule 04.05.2019