#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 КБ.