Плоский двоичный формат

#assembly #binary

#сборка #двоичный

Вопрос:

Я немного запутался в форматах bin, я использую ассемблер nasm и не совсем понимаю, как значения сегментов и BBS кодируются в BIN. Как этот формат загружается системой при выполнении?

Большое спасибо

Комментарии:

1. Разве цель плоского двоичного формата не в том, чтобы не иметь ничего из этого и вообще избегать шагов загрузки ссылок? Я думаю, что выполнение начинается только с байта 0 двоичного файла, и оттуда вы сами по себе.

2. Да, я понимаю, что это что-то вроде этого. Но мне просто интересно, как размещаются разные сегменты, и действительно ли разделы BSS заполнены нулями в файле bin.

Ответ №1:

bin не сохраняет ни структуры, ни сегментов. Весь код и данные идут как есть, нет специальных заголовков или дескрипторов. .содержимое bss игнорируется bin , и в качестве заполнителя следует использовать resb / resw / resd / etc .

Пример кода:

 bits 16
section .text
org 100h

; copy hw[] to copy[]
mov si, hw
mov di, copy
mov cx, 15
cld
rep movsb

; print copy[]
mov dx, copy
mov ah, 9
int 21h
ret

section .bss

blah db "0123456789abcdef" ; data will be ignored, nasm will warn here

copy resb 15 ; reserve 15 bytes for the text string

section .data

hw db "Hello Wrold!",13,10,"$"
  

Компиляция:

 C:>nasm nsm.asm -fbin -onsm.com
nsm.asm:20: warning: attempt to initialise memory in a nobits section: ignored
  

Разборка:

 C:>ndisasm -b 16 -o 100h nsm.com
00000100  BE1401            mov si,0x114
00000103  BF3401            mov di,0x134
00000106  B90F00            mov cx,0xf
00000109  FC                cld
0000010A  F3A4              rep movsb
0000010C  BA3401            mov dx,0x134
0000010F  B409              mov ah,0x9
00000111  CD21              int 0x21
00000113  C3                ret
00000114  48                dec ax ; this is hw db "Hello Wrold!",13,10,"$"
00000115  656C              gs insb
00000117  6C                insb
00000118  6F                outsw
00000119  205772            and [bx 0x72],dl
0000011C  6F                outsw
0000011D  6C                insb
0000011E  64210D            and [fs:di],cx
00000121  0A24              or ah,[si]
  

Работает на Windows XP (или DOS):

 C:>nsm.com
Hello Wrold!
  

ОС ожидает, что программы в стиле DOS .COM не имеют специальной структуры, и самый первый байт файла содержит первую инструкцию, которая должна быть выполнена.

Пожалуйста, обратитесь к документации NASM для получения подробной информации. Я считаю, что вы можете найти там все ответы на свои вопросы.

Комментарии:

1. Спасибо! Это действительно прояснило ситуацию. Но означает ли это, что с помощью BIN сегментный регистр предназначен исключительно для адресации (реальный режим?), А не для управления сегментами (защищенный режим)?

2. @user982401: разделы / сегменты Nasm в двоичном формате практически бесполезны, вы можете иметь их в исходном файле, но в выходном двоичном файле их почти нет. Если вы соберете исходный файл в какой-либо другой выходной формат, например, obj, coff / aout, elf, win32, тогда разделы / сегменты попадут в выходной файл, и компоновщик сможет выполнить с ними некоторую значимую работу (создайте соответствующий исполняемый файл для ОС с его частямипомечается как код (исполняемый), данные (неисполняемые) и т.д.). Только в формате obj разделы / сегменты представляют сегменты x86.

3. @user: в реальном режиме сегменты используются только для адресации, на самом деле это хак, позволяющий получить доступ к 1 МБ на 16-битной машине, которая в противном случае имела бы доступ только к 64 КБ.