2012-12-28 2 views
3

내 OS의 외부 프로그램으로 플랫 이진 파일을 사용하고 있습니다. 컴파일 할 때 다음과 같이하면된다 :char 배열의 내용을 플랫 이진 파일에 포함하십시오.

그러나 이렇게하면 문자 배열의 내용이 파일에 저장되지 않는다. 이건 내 코드입니다 :

00008000 <_start>: 
8000: 55      push ebp 
8001: 89 e5     mov ebp,esp 
8003: a1 70 90 00 00   mov eax,ds:0x9070 
8008: bb 00 00 00 00   mov ebx,0x0 
800d: cd 01     int 0x1 
800f: a1 74 90 00 00   mov eax,ds:0x9074 
8014: bb 00 00 00 00   mov ebx,0x0 
8019: cd 01     int 0x1 
801b: b8 00 00 00 00   mov eax,0x0 
8020: 5d      pop ebp 
8021: c3      ret  

당신의를 볼 수 있듯이 :

static volatile char string[4] = "Hi!\0"; 
static volatile char string2[15] = "Hello, World!\n\0"; 

int _start() 
{ 
    asm("mov eax, [string]"); 
    asm("mov ebx, 0x00"); 
    asm("int 0x01"); 
    asm("mov eax, [string2]"); 
    asm("mov ebx, 0x00"); 
    asm("int 0x01"); 
    return 0; 
} 

나는 (내가 엘프에 그것을 실행,하지만 난 그게이 같은 코드를 가지고 확인) objdump를 실행할 때 텍스트를 찾을 수 없습니다. 나는 그것이 다음과 같은 것을 할 것이기를 바랬다 :나는 그것이 nasm과 함께 할 것이다.

어셈블리에서 이것을 코딩하지 않고 출력 빈 파일의 문자를 포함하도록하려면 어떻게해야합니까?
미리 감사드립니다.

+0

추가 좀 더 유용한 태그 –

+0

@ GrijeshChauhan 고마워,하지만 이건 정말 임베디드 자격이 될까요? 이것은 일반 PC에서 실행됩니다. – farlepet

+0

네,하지만 임베디드 용으로 주목받는 사람들을 추가했습니다. 나는 또한 그들이이 질문에 당신을 도울 수 있다고 생각합니다 :) –

답변

4

이진 실행 파일은 일반적으로 섹션으로 나뉩니다. 문자열은 단순히 코드와 다른 섹션에 배치되었습니다. 코드는 읽기 전용이어야하지만 문자열은 비 const 및 휘발성으로 선언 되었기 때문에 이는 의미가 있습니다.

+0

objcopy를 수행하는 동안 (텍스트라고 생각하는) 같은 섹션에 강제로 삽입 할 수있는 방법이 있습니까? – farlepet

+1

@farlepet : 문자열을 바이너리로 가져 오기 위해'-j .data'를'objcopy' 인수에 추가 할 수 있습니다. –

+0

@MichaelBurr : 내가 그렇게 할 때, 텍스트와 데이터 섹션 사이에 4000 바이트의 간격이 있습니다. 수동으로하지 않고 그것을 제거하는 방법이 있습니까? – farlepet

1

나는 어떻게하는지 알아 냈다. 우선 나는이 같은 링커 스크립트 (당신은 그것을로드 원하는 주소로 phys을 변경할 수 있습니다) 생성 :

OUTPUT_FORMAT("binary") 
ENTRY(start) 
phys = 0x8000; 
SECTIONS 
{ 
    .text phys : AT(phys) { 
    code = .; 
    *(.text) 
    *(.rodata) 
    . = ALIGN(0); 
    } 
    .data : AT(phys + (data - code)) 
    { 
    data = .; 
    *(.data) 
    . = ALIGN(0); 
    } 
    .bss : AT(phys + (bss - code)) 
    { 
    bss = .; 
    *(.bss) 
    . = ALIGN(0); 
    } 
    end = .; 
} 

그런 다음 컴파일을하고이 같은 실행 파일 링크 :

gcc -m32 -nostdlib -nostdinc -fno-builtin -o exec.o exec.c 
ld -T link.ld -melf_i386 -o exec.bin exec.o