programing

Linux에서 어셈블러를 컴파일 / 실행 하시겠습니까?

itsource 2021. 1. 17. 10:53
반응형

Linux에서 어셈블러를 컴파일 / 실행 하시겠습니까?


저는 Linux (Ubuntu 10.04)를 처음 접했고 어셈블러에 완전히 초보자입니다. 나는 몇 가지 튜토리얼을 따르고 있었고 Linux에 특정한 것을 찾을 수 없었습니다. 제 질문은 어셈블러를 컴파일 / 실행하는 데 좋은 패키지는 무엇이며 해당 패키지에 대해 컴파일 / 실행하는 명령 줄 명령은 무엇입니까?


GNU 어셈블러 (가스)와 NASM은 모두 좋은 선택입니다. 그러나 몇 가지 차이점이 있습니다. 가장 큰 것은 연산과 피연산자를 넣는 순서입니다.

gas는 AT & T 구문을 사용합니다 (가이드 : https://stackoverflow.com/tags/att/info ) :

mnemonic    source, destination

nasm은 Intel 스타일을 사용합니다 (가이드 : https://stackoverflow.com/tags/intel-syntax/info ) :

mnemonic    destination, source

어느 쪽이든 아마도 당신이 필요로하는 것을 할 것입니다. GAS에는 NASM이 아닌 MASM과 매우 유사한 Intel 구문 모드도 있습니다.


이 자습서를 사용해보십시오 : http://asm.sourceforge.net/intro/Assembly-Intro.html

Stack Overflow의 x86 태그 위키 에서 가이드 및 문서에 대한 더 많은 링크를 참조하세요.


GNU 어셈블러는 이미 시스템에 설치되어있을 것입니다. 시도 man as전체 사용 정보를 볼 수 있습니다. as개별 파일을 컴파일 하는 사용할 수 있으며 정말로 원한다면 링크 할 ld를 사용할 수 있습니다 .

그러나 GCC는 훌륭한 프런트 엔드를 만듭니다. .s 파일을 조합 할 수 있습니다. 예를 들면 :

$ cat >hello.s <<"EOF"
.section .rodata             # read-only static data
.globl hello
hello:
  .string "Hello, world!"    # zero-terminated C string

.text
.global main
main:
    push    %rbp
    mov     %rsp,  %rbp                 # create a stack frame

    mov     $hello, %edi                # put the address of hello into RDI
    call    puts                        #  as the first arg for puts

    mov     $0,    %eax                 # return value = 0.  Normally xor %eax,%eax
    leave                               # tear down the stack frame
    ret                            # pop the return address off the stack into RIP
EOF
$ gcc hello.s -no-pie -o hello
$ ./hello
Hello, world!

위의 코드는 x86-64입니다. 위치 독립적 실행 파일 (PIE)을 만들려면 lea hello(%rip), %rdi, 및 call puts@plt.

비 PIE 실행 파일 (위치 종속적 )은 정적 데이터에 32 비트 절대 주소 지정을 사용할 수 있지만 PIE는 RIP 상대 LEA를 사용해야합니다. (참조 - 64에 movq와 movabsq의 차이를movqmovabsq좋은 선택입니다.)

32 비트 코드를 작성하려는 경우 호출 규칙이 다르며 RIP 상대 주소 지정을 사용할 수 없습니다. (따라서 push $hello호출 전에 스택 인수를 팝합니다.)


작동 방식이 궁금하다면 C / C ++ 코드를 어셈블리로 직접 컴파일 할 수도 있습니다.

$ cat >hello.c <<EOF
#include <stdio.h>
int main(void) {
    printf("Hello, world!\n");
    return 0;
}
EOF
$ gcc -S hello.c -o hello.s

GCC / clang 어셈블리 출력에서 ​​"노이즈"를 제거하는 방법 도 참조하십시오 . 컴파일러 출력을 살펴보고 흥미로운 출력으로 컴파일 할 유용한 작은 함수를 작성하는 방법에 대해 자세히 알아보십시오.


NASM을 사용하는 경우 명령 줄은

nasm -felf32 -g -Fdwarf file.asm -o file.o

여기서 'file.asm'은 어셈블리 파일 (코드)이고 'file.o'는 gcc -m32또는 연결할 수있는 개체 파일 ld -melf_i386입니다. (로 어셈블 nasm -felf64하면 64 비트 개체 파일이 만들어 지지만 아래 hello world 예제는 32 비트 시스템 호출을 사용하며 PIE 실행 파일에서 작동하지 않습니다.)

추가 정보는 다음과 같습니다.

http://www.nasm.us/doc/nasmdoc2.html#section-2.1

다음 명령을 사용하여 Ubuntu에 NASM을 설치할 수 있습니다.

apt-get install nasm

다음은 식욕을 돋우는 Linux 어셈블리의 기본 Hello World입니다.

http://web.archive.org/web/20120822144129/http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html

나는 이것이 당신이 요구 한 것이기를 바랍니다 ...


Linux 용 FASM도 있습니다.

format ELF executable

segment readable executable

start:
mov eax, 4
mov ebx, 1
mov ecx, hello_msg
mov edx, hello_size
int 80h

mov eax, 1
mov ebx, 0
int 80h

segment readable writeable

hello_msg db "Hello World!",10,0
hello_size = $-hello_msg

그것은

fasm hello.asm hello

내 제안은 Programming From Ground Up 책을 얻는 것입니다.

http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf

That is a very good starting point for getting into assembler programming under linux and it explains a lot of the basics you need to understand to get started.


The assembler(GNU) is as(1)


3 syntax (nasm, tasm, gas ) in 1 assembler, yasm.

http://www.tortall.net/projects/yasm/


For Ubuntu 18.04 installnasm . Open the terminal and type:

sudo apt install as31 nasm

nasm docs

For compiling and running:

nasm -f elf64 example.asm # assemble the program  
ld -s -o example example.o # link the object file nasm produced into an executable file  
./example # example is an executable file

ReferenceURL : https://stackoverflow.com/questions/3314919/compile-run-assembler-in-linux

반응형