2013-03-04 5 views
0

Я пишу загрузчик, но я не уверен, правильно ли я делаю. Во-первых, я использую этот пакетный скрипт для компиляции моего загрузчика:org 0C700h дает странный вывод

dm\bin\dmc.exe -msdo -c -cpp bootloader.cpp 
masm\bin\ml.exe -c bootloaderASM.asm 
dm\bin\link.exe /BINARY bootloaderASM.obj bootloader.obj 

Я использую компилятор и компоновщик DMC, наряду с MASM 615 ассемблере, все они должны быть 16 бит (DMC одновременно 16 и 32) , Теперь в моем файле сборки bootloaderASM.asm, если я добавлю «org 07C00», загрузочный файл bootMaster.sys будет заполнен 0 до 07C00, тогда ожидаемый код будет заполнен. Однако, если я удалю его, выходной файл будет как и ожидалось. Как я понял, инструкция org просто корректирует адреса, используемые моими инструкциями, так что база 07C00, я полагаю, она не должна заполнять мои выходные файлы нулями?

Файлы .obj от компилятора и ассемблера кажутся в порядке. Они не содержат ведущих нулей до 0x07c00, но конечный результат компоновщика - это не так.

В настоящее время проблема с компоновщиком? как я могу это исправить/вы предлагаете другой (16-разрядный) компоновщик? Также - это нормально, если я просто игнорирую инструкцию org для моего загрузчика?

Кроме того - я написал программу для чтения моего загрузчика и записал его в загрузочном секторе виртуального жесткого диска, я могу просто изменить его, чтобы игнорировать ведущие нули в выводе компоновщика - будет ли это работать?

спасибо.

+0

Я не использовал компоновщик Digital Mars, но, возможно,/BASE' и '/ FIXED' могут выполнить то, что вы хотите (в сочетании с' ORG 0'). – Michael

+0

Благодарим вас за ответ. Поэтому я не уверен, как опция/FIXED помогает, но если я использую/BASE: 31744 (07C00 в десятичной форме), это сделает так, чтобы иметь org 0 в загрузчике? –

+0

Базовый адрес должен указываться в шестнадцатеричном, а не десятичном формате. Будет ли это работать или нет, я не знаю, так как я его не использовал. Я только предложил это как-то, что вы могли бы попробовать. – Michael

ответ

0

Как я понял, инструкция орга просто регулирует адреса, используемые мои инструкции, так что база 07C00, я полагаю, он не должен заполнить мои выходные файлов с нулями?

Согласно NASM Manual, реализация MASM из ORG фактически перемещает последующие выходы к заданному смещению.

Что касается вашего наблюдения, поскольку до этого момента могут быть коды из других модулей, файл .OBJ просто хранит смещение, ожидая, что компоновщик будет правильно позиционировать его, в случае с простым дополнением.

В настоящее время возникает проблема с компоновщиком? как я могу исправить это/вы предлагаете другой (16-разрядный) компоновщик?

Ссылка не виновата здесь. Это причуда MASN, которая действует.

Также - это нормально, если я просто игнорирую инструкцию org для моего загрузчика ?

Кроме того - я написал программу, чтобы прочитать мой загрузчик и записать его в загрузочный сектор виртуального жесткого диска, я могу просто изменить его игнорировать ведущие нули в выходе компоновщика - это будет работать?

Из-за чтения OSDev Wiki, оба могут хорошо работать, при условии, что регистры сегментов обрабатываются соответственно. Я понимаю, что вывод должен быть размещен в позиции 0 в разделе жесткого диска и загружаться в смещение 0x7c00. Пока он работает в соответствии с этой спецификацией, он «должен работать».

Следующая может обеспечить дальнейшее полезное чтение:

MASM SEGMENT (msdn.microsoft.com/en-us/library/d06y3478%28v=vs.80%29.aspx) директива в соответствующем сообщении (StackOverflow .com/вопросы/12552072/masm-segment-директива)

PS. («Мне нужна не менее 10 репутации», что я не считаю, что это мой первый пост, «чтобы разместить более двух ссылок».)

Смежные вопросы