2013-09-16 5 views
1

mov [ebx], al을 NASM에서 GAS로 변환하는 방법은 무엇입니까? mov %al, (%ebx)을 시도했지만 세그먼트 오류가 발생했습니다.NASM에서 GAS로 번역

또 다른 문제는, 내가 가스의 배열을 가지고 말할 수 .lcomm array, 50 내가 이런 array에 달러 ($) 기호를 넣어해야합니까 : mov %rbx, $array하거나 필요가 없다?

모든 대답은 도움이 될 것입니다 :)이 메모리를 액세스하지 있기 때문에

+0

NASM으로 조립하고 실제로 조립할 수있는 파일을 얻으려면'objdump -d' (또는''objconv') (http://www.agner.org/optimize/#objconv)로 분해하십시오. –

답변

0

가 첫번째로, mov %al, %ecx 정말 잘못 없습니다. 지옥, 그것들은 크기가 다르기 때문에 조립해서는 안됩니다. 즉, 귀하의 경유 코드의 올바른 번역은 mov %al, (%ecx)이며 주소는 ecx이고 메모리에 al이 기록됩니다.

다른 문의 사항 : 주소를 참조하려면 $이 필요합니다. 따라서 주소에 할당 할 수 없기 때문에 mov %rbx, $array은 유효하지 않습니다. 배열의 첫 번째 항목에 rbx을 저장하려면 mov %rbx, array을 작성하십시오. 첫 번째 항목을로드하려면 mov array, %rbx을 사용하십시오. 첫 번째 항목의 주소를로드하려면 mov $array, %rbx을 입력하거나 lea을 사용하십시오.이 주소는 특별하며 $은 필요하지 않습니다.

+0

니스, 고마워요. 미안 해요. 뭔가 놓친 있습니다. 시도해 보았습니다. ecx는 작동하지만 ebx는 작동하지 않았습니다. mov % al, (% ebx) 및 movb % al (% ebx)을 시도했지만 여전히 seg 오류가 있습니다. do? – ThisGuy

+0

'ebx'에 잘못된 주소가 있다는 것을 의미합니다. 주소로로드하지 않았을 수도 있습니다. 전체 코드를 보지 않고서 만 추측 할 수 있습니다.또한, 그것은 64 비트 코드로되어 있는데,'ebx'는 잘못 생각합니다. – Jester

+0

음, 나는 다음과 같이했다 : push % ebx 그리고 pop % ebx 그리고 나서 pop, 그것은 seg fault이다. 뭔가 잘못 됐니? – ThisGuy

1

어때 대략 intel2gas?

usage: intel2gas [options] [-o outfile] [infile] 
where options include: 
    -h  this help 
    -i  convert from intel to at&t format (default) 
    -g  convert from at&t to intel format 
    -m -t  convert from masm/tasm to at&t format 
    -c  understand C style comments 
    -I  convert inline assembler (intel to at&t only) 
    -d  output all % chars as %% 
    -V  show version 
    infile and outfile default to stdin/stdout 
0

objdump (otool on osx)를 사용하여 가스 형식으로 분해 할 수 있습니다.

+0

Intel 구문이지만 NASM이 아닌 MASM 스타일입니다. 예 : 'mov eax, symbol'는 GAS와 MASM의 메모리로부터의로드이지만, NASM의 어드레스의'mov'-immediate입니다. https://stackoverflow.com/tags/intel-syntax/info를 참조하십시오. –

0

NASM으로 어셈블하고 objdump -d으로 분해하여 단일 명령어의 AT & T 구문 버전을 얻습니다.

또는 Agner Fog의 objconv을 사용하여 GAS AT & T 구문을 사용하여 .S 파일로 분해하면 실제로 직접 어셈블 할 수 있습니다. (분기 대상에 레이블을 넣음). 그래도 여전히 데이터 변환을 처리하지는 않지만 대부분 코드라고 생각합니다.


BTW, 가스는 .intel_syntax noprefix을 사용할 수 있지만이 MASM 스타일하지 NASM, 그래서 mov eax, symbol는 부하가 아닌 주소의 mov -immediate이다. GAS .intel_syntaxmov eax, OFFSET symbol이 필요합니다. NASM과 MASM의 차이점에 대한 자세한 내용은 https://stackoverflow.com/tags/intel-syntax/info을 참조하십시오. 어드레스로서 단독 ebx를 사용 al의 1 바이트를 저장 :


mov [ebx], almov %al, (%ebx)과 동일한 명령이다. 그게 segfaulted, 그 명령 혼자가 문제가되지 않습니다. 다른 지침이 잘못되었거나 다른 종류의 문제가 있습니다. 아마도 GAS 코드를 64 비트로 어셈블 한 것입니까? Assembling 32-bit binaries on a 64-bit system (GNU toolchain).