Я создаю свою собственную "игрушечную" ОС, и я дошел до того момента, когда я пытаюсь понимать компоновочные и исполняемые форматы - в частности, у меня есть исполняемый файл в двоичном формате плоского файла, который я загружаю в память по адресу 0x500
, а затем вызываю напрямую. В качестве примера рассмотрим следующие две инструкции (я знаю, что это придумано, Я просто хотел включить в свой пример как вызов
, так и mov
)
mov ax, some_label
call some_label
; some_label is at address 0x99 into the resulting binary
До сих пор я использовал NASM для получения желаемого результата с помощью org 0x500
с помощью команды nasm -f bin myfile.asm
. Результирующая разборка выглядит так и отлично работает:
mov ax, 0x599
call 0x599
Теперь я хочу начать использовать LD, чтобы я мог связываться с другими объектами, но после многих экспериментов и чтения я все еще не совсем понимаю, что происходит, достаточно, чтобы получить надежные результаты.
Я понял, что для получения аналогичного вывода мне нужно:
.
- Может ли кто-нибудь помочь мне понять, что здесь происходит?
- И что я должен делать, чтобы дать мне такой же контроль над тем, где разрешаются адреса в результирующем двоичном файле?