Я заметил потенциальную ошибку в коде, который я пишу.
Я думал, что если бы я использовал mov ax, seg segment_name
, программа могла бы быть непереносимой и работать только на одной машине в определенной конфигурации, поскольку место загрузки может варьироваться от машины к машине.
Поэтому я решил разобрать программу, содержащую только одну эту инструкцию, на двух разных машинах под управлением DOS, и обнаружил, что проблема волшебным образом решена.
Вывод отладки на первой машине: 0C7A:014C B8BB0C MOV AX,0CBB
Вывод отладки на второй машине: 06CA:014C B80B07 MOV AX,070B
После шестнадцатеричного сброса программы я обнаружил, что неизмененные байты на самом деле B84200
.
Ручная вставка этих байтов обратно в программу приводит к mov ax, 0042
Значит, формат PE хранит ссылки на эти инструкции и обновляет их во время выполнения?
.exe
не являются переносимыми исполняемыми файлами, они re исполняемые файлы MZ. PE расширяет этот формат, делая его 32- или 64-битным, и, таким образом, предполагает плоскую модель памяти. Исправления во время выполнения в PE относятся к 32- или 64-битным смещенным частям адресов, а не к сегментным частям. (IDK детали формата, возможно, перемещение сегментов все еще поддерживается, но обычно никогда не используется.) Stack Overflow не имеет тега для исполняемых файлов MZ, поэтому я оставлю это для кого-то другого, чтобы разобраться с тегами. - person Peter Cordes   schedule 18.05.2020