bin 형식에 대해 약간 혼란 스럽습니다. nasm 어셈블러를 사용하고 있는데 어떻게 세그멘트와 BBS 값이 BIN으로 엔코 드되는지 잘 모르겠습니다. 이 형식은 실행될 때 시스템에 의해 어떻게로드됩니까?Flat 이진 형식
많은 감사
bin 형식에 대해 약간 혼란 스럽습니다. nasm 어셈블러를 사용하고 있는데 어떻게 세그멘트와 BBS 값이 BIN으로 엔코 드되는지 잘 모르겠습니다. 이 형식은 실행될 때 시스템에 의해 어떻게로드됩니까?Flat 이진 형식
많은 감사
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 설명서를 참조하십시오. 나는 당신이 거기서 당신의 질문에 대한 모든 답을 찾을 수 있다고 믿습니다.
감사합니다. 이것은 정말로 물건을 정리했다. 그러나 BIN 세그먼트 레지스터는 세그먼트 제어 (보호 모드)가 아닌 순수 모드 (실제 모드)를위한 것입니까? – jimmyzmli
@ user982401 : 바이너리 형식의 Nasm 섹션/세그먼트는 실제로 쓸모가 없습니다. 소스 파일에서 사용할 수는 있지만 출력 바이너리에는 거의 추적 할 수 없습니다. 소스 파일을 다른 출력 형식으로 어셈블하는 경우 (예 : obj, coff/aout, elf, win32 그런 다음 섹션/세그먼트가 출력 파일로 만들어지며 링커는 몇 가지 의미있는 작업을 수행 할 수 있습니다 (코드로 표시된 부분이있는 운영 체제의 적절한 실행 파일 만들기 (실행 가능), 데이터 (실행 불가능) 등). obj 형식 섹션/세그먼트에서만 x86 세그먼트를 나타냅니다. –
@user : 리얼 모드 세그먼트는 addresing에만 사용됩니다. 실제로 16KB 머신에서 1MB에 액세스 할 수있는 해킹입니다. 그렇지 않으면 64KB에 액세스 할 수 있습니다. – ninjalj
플랫 바이너리 형식의 목적이 없으므로 링크로드 단계가 전혀 필요하지 않습니까? 실행은 바이너리의 byte '0'에서 시작한다고 생각합니다. –
네, 저도 그렇게 느꼈습니다. 하지만 BSS 섹션이 실제로 bin 파일의 0으로 채워지는 경우 어떻게 다른 세그먼트가 배치되는지 궁금 할 것입니다. – jimmyzmli