Как рассчитать необходимую память для кода сборки? - PullRequest
1 голос
/ 04 ноября 2010

Это абзац из серии разработок операционной системы «Сломанный шип».Есть 3 строки кода.Для загрузки до второй строки потребуется 512 байт, а до третьей строки - 514 байт.Как мы можем рассчитать это?Если возможно, дайте мне ссылку, где я могу прочитать это подробно.Заранее спасибо.

В языке ассемблера мы очень легко можем выйти за пределы 512-байтовой метки.Таким образом, код может выглядеть просто отлично, но только часть его будет в памяти.Например, такие как:

mov ax, 4ch
inc bx ; 512 byte
mov [var], bx ; 514 byte

На языке ассемблера выполнение начинается сверху вниз файла.Однако помните, что при загрузке файлов в память мы загружаем сектора.Каждый из этих секторов имеет размер 512 байт, поэтому он скопирует в память только 512 байт файла.

Если вышеуказанный код был выполнен и в память был загружен только первый сектор, он будет копировать только до512 байт (инструкция inc bx).Таким образом, пока последняя инструкция mov находится на диске, она не находится в памяти!Что будет делать процессор после inc bx?Это будет продолжаться до 514 байтов.Так как это не было в памяти, оно будет выполнено после конца нашего файла!Конечный результат?Авария.

Ответы [ 3 ]

5 голосов
/ 04 ноября 2010

Этот пример сбивает с толку. Эти первые две инструкции занимают всего несколько байтов. Автор предполагал, что inc bx падает на 512-й байт. В общем случае вы должны собрать код, чтобы узнать, насколько он будет большим с x86, потому что коды операций имеют разную длину (от 1 до 7 байт [*]). Вы можете разместить метку до и после кода и вычесть их, чтобы узнать, насколько он большой.

В других архитектурах (например, в PowerPC) каждая инструкция имеет одинаковый размер, и вы можете просто посчитать их и умножить на 4 и быть очень близкими.

[*] Я ожидаю, что несколько ответов будут дополнены друг другом длинными инструкциями с префиксом x86 ...

3 голосов
/ 04 ноября 2010

Статья о загрузчике. Когда вы пишете код для boot sector (и его размер составляет 512 байт), вы должны использовать не более 512 байт (точнее 510, поскольку в качестве сигнатуры используются 2 последних байта).

РЕДАКТИРОВАТЬ: эти 3 инструкции имеют 3, 1 и 3 (или 2?) Байта. Он объяснял случай, когда этот код уже начинается с большим смещением.

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

0 голосов
/ 04 ноября 2010

Код, написанный на языке ассемблера, преобразуется в инструкции процессора, которые интерпретируются процессором. Согласно спецификации Itel x86, инструкции могут быть переменной длины.

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

...