2011-07-26 5 views
3

나는 라인이 일부 NASM 파일이 :NASM 가스 : 호출 equ'd 문자

b_print_newline   equ 0x0000000000100040 

bmdev.asm을 포함 파일 :

%INCLUDE "bmdev.asm" 

bmdev.asm 파일은 다음과 같은 EQU 지시어를 가지고 그런 다음 해당 항목을 호출 할 수 있습니다. 나는.

call b_print_newline 

GAS로 변환 할 수있는 방법이 있습니까? 내가 즉, 직접 번역을 할 때

.set b_print_newline , 0x100040 

call b_print_string 

옳은 일에 분해가 표시되지 않습니다

callq 0xfffffffffff00040 

:

callq *0x100040 

NASM 호출로 분해 여기서 목표는 NASM 대신 GAS를 통해 BareMetal OS에 대한 바이너리를 생성하는 것입니다.

작동 이진의 전체 분해 :

$ objdump -D -b binary -m i386:x86-64 test-nl.app 

test-nl.app:  file format binary 


Disassembly of section .data: 

0000000000000000 <.data>: 
    0: e8 3b 00 f0 ff   callq 0xfffffffffff00040 
    5: c3      retq 

작동하지 않는 바이너리의 전체 분해 :

$ objdump -D -b binary -m i386:x86-64 test-nl-a.app 

test-nl-a.app:  file format binary 


Disassembly of section .data: 

0000000000000000 <.data>: 
    0: ff 14 25 40 00 10 00 callq *0x100040 
    7: c3      retq 

나는의 (희망) 깨끗한 버전을 게시 한 이 질문. 이걸 닫아라.

+0

어셈블 할 바이트 (16 진수)를 표시 할 수 있다면 도움이 될 수 있습니다. – user786653

+0

@ user786653 전체 디스 어셈블리 정보로 질문을 업데이트했습니다. – dharmatech

+0

(b_print_string을 0x100040으로 변경 한 후) 잘 돌아가고 있습니다. 'call b_print_string'는 올바른 바이너리를 생성하지만,'call * b_print_string'은 잘못된 바이너리를 생성합니다. 어쩌면 코드에있는 것이 아니라 컴파일하는 동안의 당신의 주장에있을 것입니다. – ughoavgfhw

답변

1

아마도 똑똑한 사람에 이동할 수 있습니다, 상대 전화를 생성하는 얻을 그렇게 어려운 것이 이상한의 종류를 보인다

을 어쨌든, 일 :.에

.set b_print_newline, 0x100040 
call b_print_newline 

결과를 (로 너는주의했다) 간접 점프를 생성하는.

당신은 사용하여 자신에 가짜 수있는 . (dot) 의사 변수 :

call b_print_newline - . 

또는 (당신이 원하는대로 명령 줄 또는 스크립트) 당신이 올바른 이름으로 문자를 정의하기 위해 링커를 사용 할 수있는 코드가 원하는대로 컴파일됩니다.

$ cat test.S 
.section .text 
.globl _start 
_start: 
    call b_print_newline 
    ret 
$ as --64 -o test.o test.S 
$ ld --defsym b_print_newline=0x100040 -Ttext 200000 --oformat binary -o test.bin test.o 
$ objdump -D -b binary -m i386:x86-64 test.bin 
test.bin:  file format binary 

Disassembly of section .data: 

0000000000000000 <.data>: 
    0: e8 3b 00 f0 ff   callq 0xfffffffffff00040 
    5: c3      retq 

이이 문자를 정의하기 위해 링커를 사용하지 않고 작업을 할 수있는 방법은 아마도,하지만 난 방법을 찾을 수 없어.

+0

평소처럼 좋은 조언. 감사합니다. @ user786653! – dharmatech