2011-10-06 2 views
0

bin 형식에 대해 약간 혼란 스럽습니다. nasm 어셈블러를 사용하고 있는데 어떻게 세그멘트와 BBS 값이 BIN으로 엔코 드되는지 잘 모르겠습니다. 이 형식은 실행될 때 시스템에 의해 어떻게로드됩니까?Flat 이진 형식

많은 감사

+0

플랫 바이너리 형식의 목적이 없으므로 링크로드 단계가 전혀 필요하지 않습니까? 실행은 바이너리의 byte '0'에서 시작한다고 생각합니다. –

+0

네, 저도 그렇게 느꼈습니다. 하지만 BSS 섹션이 실제로 bin 파일의 0으로 채워지는 경우 어떻게 다른 세그먼트가 배치되는지 궁금 할 것입니다. – jimmyzmli

답변

2

bin 어떤 구조 나 세그먼트를 유지하지 않습니다. 모든 코드와 데이터는 그대로 사용되며 특별한 헤더 나 설명자는 없습니다. bin에 대한 .bss 내용은 무시되며 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 "abcdef" ; 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] 

윈도우 XP (또는 DOS)에서 실행 :

C:\>nsm.com 
Hello Wrold! 

DOS에서는 .COM 스타일 프로그램에 특수 구조가 없으며 파일의 첫 번째 바이트에 실행해야하는 첫 번째 명령이 포함되어있을 것으로 예상됩니다.

자세한 내용은 NASM 설명서를 참조하십시오. 나는 당신이 거기서 당신의 질문에 대한 모든 답을 찾을 수 있다고 믿습니다.

+0

감사합니다. 이것은 정말로 물건을 정리했다. 그러나 BIN 세그먼트 레지스터는 세그먼트 제어 (보호 모드)가 아닌 순수 모드 (실제 모드)를위한 것입니까? – jimmyzmli

+0

@ user982401 : 바이너리 형식의 Nasm 섹션/세그먼트는 실제로 쓸모가 없습니다. 소스 파일에서 사용할 수는 있지만 출력 바이너리에는 거의 추적 할 수 없습니다. 소스 파일을 다른 출력 형식으로 어셈블하는 경우 (예 : obj, coff/aout, elf, win32 그런 다음 섹션/세그먼트가 출력 파일로 만들어지며 링커는 몇 가지 의미있는 작업을 수행 할 수 있습니다 (코드로 표시된 부분이있는 운영 체제의 적절한 실행 파일 만들기 (실행 가능), 데이터 (실행 불가능) 등). obj 형식 섹션/세그먼트에서만 x86 세그먼트를 나타냅니다. –

+0

@user : 리얼 모드 세그먼트는 addresing에만 사용됩니다. 실제로 16KB 머신에서 1MB에 액세스 할 수있는 해킹입니다. 그렇지 않으면 64KB에 액세스 할 수 있습니다. – ninjalj