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의 차이를 도 movq
도 movabsq
좋은 선택입니다.)
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
'programing' 카테고리의 다른 글
연관 배열을 인덱스 배열로 변경 / Zend_Table_Row_Abstract를 비 연관으로 가져옵니다. (0) | 2021.01.17 |
---|---|
PHP에서 아포스트로피 ( ') 대신 â € ™ 얻기 (0) | 2021.01.17 |
Java에서 문자열 목록을 초기화하는 가장 짧은 방법은 무엇입니까? (0) | 2021.01.17 |
Rails로 문자열을 자르시겠습니까? (0) | 2021.01.17 |
Github README.md에서 디렉토리 트리를 나타내는 방법이 있습니까? (0) | 2021.01.17 |