2014-10-30 9 views
6

어셈블리 언어를 배우기로 결심했습니다. 어셈블리 언어를 배우는 것이 많은 이점을 가지고 있으며, 하드웨어와 직접 상호 작용할 수 있고, 컴퓨터가 더 좋은 방법 등을 배울 수 있음을 알게되었습니다. 처음 배우기 시작했을 때, 조금 이상하고 다른 프로그래밍 언어와 다르다는 것을 알게되었으므로 배울 것이 어려울 것이라고 생각했습니다. 그래서 어셈블리 언어를 배우기위한 기본적인 전제 조건은 무엇인지 묻고 있습니다. 자세한 내용은 C, C++, C#, PHP 등의 프로그래밍 언어를 이미 배웠습니다.어셈블리 언어 학습을위한 전제 조건

+1

IMO의 경우 숫자, 비트 논리 연산 ('및','또는','xor' 등) 및 대상 아키텍처/OS의 메모리 모델에 대한 16 진수 및 2 진법에 익숙해야합니다. 어셈블리 프로그래밍에 대한 일부 책/자습서는 이러한 것들을 설명 할 수도 있고, 다른 사람들은 이미 알고 있다고 가정 할 수도 있습니다. – Michael

답변

7

어떤 기계 어셈블리를 배워야하는지 알려줘야합니다. ARM, , Sparc 등은 모두 다른 ISA입니다.

어셈블리 프로그래밍 세계에 대한 소개를 원할 경우 Randal Hyde's Art of Assembly이 좋습니다. (작성한 내용이 정확히 어셈블리가 아니지만 고수준과 저급 언어가 혼합 된 것이지만 당신을 컨셉으로 멋지게).

광경을 x86으로 설정 한 경우이 책을 추천 할 수 있습니다 : Professional Assembly Language. 그 책 외에도 sandpile.org은 훌륭한 자료입니다.

x86의 경우 환경 선택도 중요합니다. Here은 University of Illinois Urbana Champaign ACM 학생 장 - SIGWINDOWS의 Windows 어셈블리 프로그래밍을위한 훌륭한 자습서입니다. 유닉스의 경우 내가 만난 위대한 튜토리얼은 this one입니다. Dennis Yurichev의 위대한보다 일반적인 리소스는 Reverse Engineering for Beginners입니다. 이 책은 Windows 및 Unix 환경을 대상으로하며 리버스 엔지니어링과 관련이 있지만 컴퓨터에서 실행되는 프로그램의 매스 닝에 대해 많은 것을 배울 수 있습니다.

ARM의 경우, this article은 훌륭한 소개입니다. This article is also another great introduction to the matter

+0

+1, sandpile.org 링크는 굉장합니다! –

0

어셈블리는 이미 배운 고급 언어와는 다릅니다.

86 레지스터 것이 좋은 출발점, 여기에 내가 그들을 설명 찾을 수있는 사이트는 다음과 같습니다

http://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html

행운을 빕니다!

편집 :

또한 그것이 내가 꽤 괜찮은 크기의 커뮤니티를 가지고 있으며, 기호 관리, 네임 스페이스와 같은 멋진 기능을 가지고 있습니다 NASM, 시작 예를 들어, 항상 시작하고 특정 어셈블리 언어를 고수하는 것이 좋다.

+0

우리가 필요한 모든 것입니까? 우리가이 복잡한 언어를 배울 필요가있는 모든 것입니까? –

+0

아니, 나는 시작하는 것이 좋은 장소라고 말했다. – dreamgt

1

컴퓨터, 어셈블러, 문제의 어셈블리 언어를 설명하는 서적. C를 알고 있기 때문에 일부 C 컴파일러는 C 사이에 어셈블리를 작성할 수 있습니다.

+0

저는 어셈블리 언어의 학습 전제 조건과 어셈블리 언어를 배우는 데 필요한 자료가 무엇인지에 대해 실제로 묻습니다. –

+2

나는 진짜 전제 조건이 있다고 생각하지 않는다. 그것은 뉴턴 물리학을 배울 수 있기 전에 당신이 대수학을 배워야하는 물리학과는 다릅니다. – timwaagh

3

약 두 달 전에 어셈블리를 프로그래밍하기 시작했으며 지금까지 아주 잘 진행되었습니다. 지금까지 내가 배운 것을 요약 해 보겠다.

구문

86 어셈블리에 대한 두 가지 주요 구문의가 있습니다 & AT 인텔T가. 각자 장단점이 있습니다.Intel 구문은 x86 기반 프로세서에만 사용되는 반면 AT & T 구문은 여러 아키텍처 (예 : ARM)에 사용됩니다. 당신이 OpenBLAS에 대한 소스 코드를 보면 당신은 그들이 여러 가지 아키텍처 & T 구문에서를 사용하는 것을 볼 수 있습니다. 그러나 많은 사람들이 인텔 구문이 더 읽기 쉽다고 생각합니다. 지금까지 Intel 문법을 사용하여 프로그래밍을 해왔지만 AT & T 구문을 읽는 방법을 알고 있습니다.

어셈블러

당신은 GCC 인라인 어셈블리를 사용하지만 MSVC 64 비트 수 있습니다. 지금까지 인라인 어셈블리로 귀찮게하지 않았습니다. MASM, NASM, YASM, FASMGAS : 당신 같은 선택할 수있는 여러 가지 어셈블러가 있습니다. MASM은 Intel 문법 만 사용하며 이해하기에 Windows 용으로 만 사용됩니다 (Linux 용 ELF 오브젝트 파일이라고는 생각하지 않습니다). NASM은 인텔 문법 만 사용하지만 몇 가지 다른 객체 파일을 생성 할 수 있습니다. Windows 및 Linux 용. 내가 말할 수있는 한 YASM은 대부분 NASM이지만 AT & T 구문을 지원합니다. FASM은 인텔 구문을 사용하며 여러 가지 다른 오브젝트 파일을 만들 수 있지만 NASM 및 YASM에서 여러 가지 방식으로 분기됩니다. 나는 FASM을 아직 사용하지 않았지만 유혹을 느낀다. GAS는 AT & T 구문을 사용합니다 (Intel 구문을 사용할 수도 있지만). 실제로 GCC로 컴파일 할 때 사용됩니다. GCC는 GAS로 보내지는 어셈블리를 생산합니다.

각 어셈블러는 코드가 반드시 NASM에서 상자 밖으로 조립 MASM로 작성 기대할 수 없다, 그래서 그것은 단지 방언의가 있음을 이해하는 것이 중요합니다. NASM과 YASM은 대부분 내가 이해하는 한 호환 가능합니다.

당신이 어셈블러를 선택해야

? 지금까지 NASM 만 사용했습니다.

규칙을 호출하고 C

지금까지왔다 GCC 나를 위해 조립 학습을위한 가장 좋은 소스와 연결. C로 코드를 작성한 다음 어셈블리를 살펴보십시오. 예를 들어, 당신은 당신이

gcc -O3 -S foo.c    //AT&T syntax 
gcc -O3 -S -masm=intel foo.c //Intel syntax 

은 다음 파일 foo.s보고 할 수 foo 간단한 기능이 있거나 당신은 당신의 OS의 function calling conventions을 알아야한다 objdump

gcc -O3 -c foo.c 
objdump -d foo.o    //AT&T syntax 
objdump -d -Mintel foo.o  //Intel syntax 

를 사용할 수 있는지. 호출 규칙은 32 비트 코드와 64 비트 코드에서 서로 다릅니다. Windows 및 Linux의 경우 32 비트 코드는 동일하지만 64 비트 코드는 다릅니다. 지금까지 Linux 64 비트 용 NASM을 사용하여 어셈블리 코드만을 작성했습니다. SO에 조립 질문

많은 사용자 입력 및 출력을 포함하여 어셈블리의 전체 기능을 쓰기에 대한 것으로 보인다. 나는 이것이 필요하다고 생각하지 않는다. C가 입출력을 처리하도록합시다. 이 예는 this question입니다. NASM 코드와 C 코드를 제공하고 어셈블리, 컴파일 및 링크 방법을 설명했습니다. 이것은 내가 x86 어셈블리에 쓴 최초의 것들 중 하나였습니다. 그 문제 I는 규칙이 rdi 레지스터의 첫 번째 파라미터 rsi에서 제하고 rdx 제 통과 호출 함수

float triad(float *x, float *y, float *z, const int n); 

리눅스 - 64 (또는 오히려 시스템 V AMD64 ABI)를 가졌다. 그래서이 경우에 rdi=x, rsi=y, rdx=n.

호출 규칙을 무시하고 C로 어셈블리에서 오브젝트 파일을 인터페이스 할 수 있으면 어셈블리 작업을 훨씬 쉽게 할 수 있습니다.

마지막으로 나를위한 두 번째로 훌륭한 학습 자료는 Agner Fog's Optimizing Assembly manual입니다. 초보자를위한 설명서 첫 부분에는 많은 조언이 있습니다. 그리고 일단 경험을 얻게되면, 매뉴얼의 뒷부분에는 많은 좋은 정보가 있습니다.

1

올바른 도서를 선택하는 데 전제 조건이 실제로 필요하지 않습니다.

Assembly Language Step-by-Step: Programming with Linux 3rd Edition으로 자신의 첫 번째 프로그래밍 언어로서 (개인 교사없이) 어셈블리 언어 (기본은 더 이상 필요하지 않음)를 배웠습니다. 기본을 가르치지 만,이 책을 읽은 후에는 다른 고급 어셈블리 서적을 아무런 문제없이 읽을 수 있습니다.