Неправильный размер скомпилированного загрузчика - PullRequest
4 голосов
/ 12 марта 2019

Я делаю загрузчик, но он генерирует 513-байтовый выходной файл, тогда как он должен быть 512 бит. Вот boot.asm

[ORG 7C00]
[BITS 16]
mov eax,cr0
or eax,1
mov cr0,eax
[BITS 32]
mov ax,10h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
INT 0x10
jmp 0x8000
TIMES 510 - ($ - $$) DB 0
DW 0xAA55

Как я могу получить 512 байт вывода?

1 Ответ

2 голосов
/ 13 марта 2019

Вы исключили 0x из шестнадцатеричной константы 7C00 в вашей директиве ORG. NASM рассматривает это как ошибку.

Вы, вероятно, собрали это с YASM, который вместо отклонения вашего источника создает 513-байтовый файл . Исправление вашего источника заставляет и YASM, и NASM создавать 512-байтовый файл. Это, вероятно, ошибка в YASM . К сожалению, в последнее время YASM не был в хорошем состоянии, поэтому, несмотря на то, что он имеет более длинные длинные NOP из директив align (не разбирая разборку со многими строками однобайтового NOP), вам, вероятно, следует просто переключиться на NASM.

$ yasm boot-buggy.asm && ll boot-buggy
-rw-r--r-- 1 peter peter 513 Mar 13 06:03 boot-buggy
$ nasm boot-buggy.asm && ll boot-buggy
boot-buggy.asm:1: error: expression syntax error
boot-buggy.asm:1: error: No or invalid offset specified in ORG directive.
$ nasm boot-fixed.asm && ll boot-fixed
-rw-r--r-- 1 peter peter 512 Mar 13 06:04 boot-fixed
$ yasm boot-fixed.asm && ll boot-fixed
-rw-r--r-- 1 peter peter 512 Mar 13 06:04 boot-fixed

cmp -l boot-fixed boot-buggy показывает, что версия с ошибкой имеет дополнительный 0 байт в качестве первого байта файла, , тогда все остальные совпадают.

...