Вопрос о выводе "Link Map" и директиве "Assume" ассемблера MASM - PullRequest
1 голос
/ 04 апреля 2010

Я новичок в MASM. Так что вопросы могут быть довольно простыми.

Когда я использую ассемблер MASM, есть выходной файл с именем " Link Map ". Его содержимое состоит из начального смещения и длины различных сегментов, таких как сегмент данных, сегмент кода и сегмент стека. Мне интересно, что, где эта информация описывает? Говорят ли они о том, как различные сегменты располагаются в файле EXE или как сегменты располагаются в памяти после загрузки файла EXE в память загрузчиком программы?

Кстати: что делает директива «Предполагать»? Насколько я понимаю, он говорит ассемблеру выдать некоторую информацию в заголовок exe-файла , чтобы загрузчик программы мог использовать ее для соответствующей установки регистра DS, CS, SS, ES. Я прав в этом?

Заранее спасибо.

1 Ответ

1 голос
/ 04 апреля 2010

Карта линкера

это не специфично для MASM. Это часть компоновщика. * Т.е. 1003 *

ml /Fm foo.asm

совпадает с

ml foo.asm /link /map

или

ml /c foo.asm
link foo.obj /map

cl.exe также имеет эту опцию (/Fm), которая делает то же самое.

Это список разделов , которые размещаются в образе EXE или DLL, в порядке их появления. Например. код, данные, ресурсы, таблица импорта, таблица экспорта и т. д.

Смещение относительно начала раздела изображения. Ряд разделов объекта может быть объединен компоновщиком в раздел изображения.

1022 * Е.Г. *

 0002:00001514 00000014H .idata$2                DATA
 0002:00001528 00000014H .idata$3                DATA
 0002:0000153c 000000f8H .idata$4                DATA
 0002:00001634 00000464H .idata$6                DATA

Выше приведены разделы объектов (они взяты из .obj файлов), поскольку они содержат суффикс, начинающийся с $. Компоновщик объединит их в один раздел .idata в последнем модуле изображения (в лексикографическом порядке суффикса). Смещение относительно начала, где компоновщик будет размещать таблицу адресов импорта (раздел .idata).

Пусть

Обеспечивает проверки во время компиляции, чтобы предотвратить случайное неправильное использование регистров. Он не генерирует никакого кода. См

...