이 교과서는 어셈블리 언어 프로그래밍에 대해 부드럽게 소개합니다. 이 소개를 "부드럽게" 만드는 이유는 독자가 이미 C 또는 C++ 코딩에 익숙하다고 가정하기 때문입니다. 우리는 이 가정된 지식을 사용하여 낮은 수준의 ISA(명령어 집합 아키텍처)로 역방향 연결합니다 .
우리는 매우 날카로운 점을 집으로 가져갑니다.
어셈블리 언어는 두려워할 것이 없습니다!언급했듯이 이미 C(또는 C++ 등 C에서 파생된 언어)에 익숙하다면 이 책은 이미 알고 있는 것부터 시작합니다.
이후 장에서는 ARM V8 ISA의 구석과 움푹 들어간 부분에 대해 더 깊이 다루며 64비트 ARM 프로세서의 풍부한 명령어 세트를 마스터하려는 사람들에게 적합합니다.
네, 물론이죠.
어셈블리 언어 프로그래밍은 기본 하드웨어 아키텍처에 매우 밀접하게 의존합니다. 호스트 운영 환경은 어셈블리 언어 프로그램 구성 방법을 결정하는 데 큰 역할을 합니다. "호출 규칙"은 함수가 호출되는 방식과 매개변수가 전달되는 방식을 나타냅니다.
원래 이 책에서는 ARM LINUX 규칙만 가르쳤습니다. 그러나 시간이 지나면서 우리는 MacOS나 LINUX에서 사용할 코드를 훨씬 쉽게 작성할 수 있는 매크로 모음을 개발했습니다.
이 링크는 해당 문서의 최신 사본과 문서로 연결됩니다. 프로그래밍을 좀 더 쉽게 해주는 매크로도 포함되어 있습니다.
이 장에서는 Apple Silicon 어셈블리 언어 프로그래밍에 대한 몇 가지 추가 정보를 제공합니다.
OS 시스템을 호출하는 대신 C 런타임을 직접 사용한다는 점을 알 수 있습니다. 예를 들어 write()
호출하려면 어셈블리 언어에서 write
호출합니다.
이 버전의 시스템 호출 write
시스템 호출 수행에 대한 하위 수준 세부 정보를 처리하는 CRT(C 런타임)에 내장된 래퍼 함수입니다. 이러한 래퍼 함수 내에서 실제로 어떤 일이 발생하는지 여기를 참조하세요.
CRT 래퍼를 사용하면 CRT 래퍼를 사용하여 마스킹되는 배포판과 아키텍처 간에 차이가 있다는 이점이 있습니다. 따라서 시스템 호출을 직접 수행하는 방법보다 래퍼를 사용하면 코드의 이식성이 더 높아집니다.
ARM 디자인이 칭찬할만한 만큼 지적 재산에 대한 ARM의 명명 규칙은 끔찍합니다. 이 책에서 AARCH64 및 ARM V8은 64비트 ISA(ARM Instruction Set Architecture)의 동의어로 간주됩니다.
ARM 사이트에는 버전이 너무 많고 동일한 항목에 대한 이름도 많고 일반적으로 문서도 너무 많기 때문에 문서를 찾기가 매우 어렵습니다. 정말 화가 날 수 있습니다.
본문 내에서 우리는 적절하게 관련 링크를 제공할 것입니다.
다음은 "a" 기본 명령어 세트 페이지에 대한 링크입니다.
어셈블리 언어 개발을 위한 도구를 얻는 것은 매우 간단합니다. 아마도 이미 갖고 있을 수도 있습니다. Linux 터미널에서 apt
사용하여 다음과 같이 말합니다.
sudo apt update
sudo apt install build-essential gdb
Macintosh에서는 다음을 입력합니다.
xcode-select --install
터미널에 들어가서 지시를 따르세요. gdb
여러분을 울릴 만큼만 차이점이 있는 lldb
로 대체되었습니다.
그렇다면 당신이 가장 좋아하는 편집기가 필요합니다. 우리는 빠른 편집을 위해 vi
사용하고 무거운 작업을 수행하려면 Visual Studio Code를 사용합니다.
우리는 C "컴파일러"인 gcc
사용합니다. g++
도 사용할 수 있습니다. Mac에서는 clang
사용할 수도 있습니다.
어셈블리 언어를 "컴파일"하기 위해 "컴파일러"를 사용하는 것이 무슨 의미가 있습니까?
글쎄, 이에 대답하려면 "컴파일러"라는 단어가 빌드 시퀀스의 한 단계만을 의미한다는 점을 이해해야 합니다. 우리가 "컴파일러"라고 말하는 것은 실제로 다음을 포함하는 우산입니다.
#include
와 같은 #
처리기 명령에 대해 작동하는 전처리기입니다. 이러한 명령은 C 또는 C++의 일부가 아닙니다. 오히려 전처리기에 대한 명령입니다.
어셈블리 언어 파일이 .S
- 대문자 S로 끝나는 경우 gcc
C 전처리기를 호출합니다. 시스템에 따라 파일이 소문자 s 또는 다른 파일 확장자로 끝나는 경우 호출될 수도 있고 호출되지 않을 수도 있습니다.
C 및 C++와 같은 고급 언어를 어셈블리 언어로 바꾸는 작업을 수행하는 실제 컴파일러입니다.
어셈블리 언어를 아직 실행 준비가 되지 않은 기계어 코드로 바꾸는 어셈블러입니다.
마지막으로 잠재적으로 많은 중간 기계 코드 파일(객체 파일이라고 함)과 잠재적으로 많은 라이브러리 파일(Windows에서는 정적으로 링크된 .dll, Linux에서는 .a 파일)을 결합하는 링커입니다. 링커는 이 체인의 마지막 단계입니다.
다음은 이 과정을 설명하는 비디오입니다.
gcc와 g++는 우산으로서 위의 단계를 자동화하고 자동으로 CRT와 연결되기 때문에 직접 사용합니다.
C 파일(main.c)에 main()
구현했고 작성한 어셈블리 언어 파일(asm.S)을 사용하려고 한다고 가정합니다. 여러 가지 방법으로 수행할 수 있습니다.
gcc main.c asm.S
이것이 최소한의 빌드에 필요한 전부입니다. 결과 프로그램은 a.out
에 기록됩니다. 생성된 모든 중간 파일이 제거됩니다.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
이런 방식으로 사용하면 .o
파일이 디스크에 남습니다. 이전 방법을 사용하면 .o
파일이 표시되지 않고 제거됩니다.
main()
이 어셈블리 언어로 구현되고 main.s
자체 포함되어 있다고 가정하면 간단히 다음과 같습니다.
gcc main.S
디버거 gdb
또는 lldb
활성화하려는 경우가 종종 있습니다. 다음을 수행하십시오.
gcc -g main.S
-g
명령줄 옵션이 없으면 디버거가 제대로 작동하지 않을 수 있습니다.
반복하자면, gcc
C 전처리기를 통해 코드를 실행하도록 하려면(예: #include
처리를 위해) 대문자 S를 사용하여 어셈블리 언어 소스 코드 파일 이름을 지정합니다. 따라서 Linux에서는 다음과 같습니다.
gcc main.s
C 전처리기를 거치지 않지만
gcc main.S
할 것이다.
"컴파일러"가 우산이라는 점을 강조하기 위해 gcc를 사용하여 프로그램을 "컴파일"하면 ARM에서 실행되는 Ubuntu에서 다음이 호출됩니다.
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
는 C 전처리기입니다. 다른 언어(예: C++)에서도 사용할 수 있는 일반적인 도구입니다.
cc1
은 실제 컴파일러입니다.
어셈블러 as
.
ld
링커입니다.
이 책에서 우리가 기본적으로 우산 명령을 사용하는 이유를 알 수 있습니다.
우리는 C 및 C++에서 어셈블리 언어로의 "브리징"을 제공하는 것부터 시작합니다. 우리는 새로운 지식을 배우기 위해 이미 가지고 있는 지식을 사용합니다. 정말 멋지네요!
장 | 가격 인하 | |
---|---|---|
0 | 킥스타트 | 링크 |
1 | 안녕하세요 세계 | 링크 |
2 | If 문 | 링크 |
3 | 루프 | |
3아 | while 루프 | 링크 |
3b | For 루프 | 링크 |
3c | 계속 구현 | 링크 |
3d | 휴식 구현 | 링크 |
4 | 막간 | |
4a | 레지스터 | 링크 |
4b | 로드 및 저장 | 링크 |
4c | ldr 에 대한 추가 정보 | 링크 |
4d | 레지스터 크기 | 링크 |
4e | 16진수 | 링크 |
5 | switch | 링크 |
6 | 기능 | |
6a | 부르기와 돌아오기 | 링크 |
6b | 매개변수 전달 | 링크 |
6c | 몇 가지 일반적인 C 런타임 함수 호출의 예 | 링크 |
7 | FizzBuzz - 완전한 프로그램 | 링크 |
8 | 구조체 | |
8a | 조정 | 링크 |
8b | 정의 | 링크 |
8c | 사용 | 링크 |
8일 | 이게 뭔가요" | 링크 |
9 | const | 링크 |
부동 소수점 연산은 자체 명령어와 레지스터 세트를 사용합니다. 따라서 부동 소수점 연산은 해당 섹션에서 다룹니다.
장 | 가격 인하 | |
---|---|---|
0 | 장 개요 | 링크 |
1 | 부동 소수점 숫자란 무엇입니까? | 링크 |
2 | 레지스터 | 링크 |
3 | 잘림 및 반올림 | 링크 |
4 | 리터럴 | 링크 |
5 | fmov | 링크 |
6 | 반정밀 수레 | 링크 |
7 | NEON SIMD 아직 작성되지 않음 | 링크 |
비트 배싱 없이 어셈블리 언어에 관한 책이 무엇이겠습니까?
장 | 가격 인하 | |
---|---|---|
1 | 비트 필드 | |
1a | 비트 필드 없음 | 링크 |
1b | 비트 필드 포함 | 링크 |
1c | 새로 설명된 지침 검토 | 링크 |
2 | 엔디안 | 링크 |
이 섹션에서는 디버깅에 관한 "세계적으로 유명한 강의"를 포함한 기타 자료를 소개합니다. 이번 강의는 여러 대학에 초청되어 진행되었습니다. C, C++ 및 어셈블리 언어와 같은 언어로 작업하는 청중을 대상으로 하지만 여기에 포함된 일부 강의는 모든 언어에 적용 가능합니다.
장 | 가격 인하 | |
---|---|---|
1 | 애플실리콘 | 링크 |
2 | 애플/리눅스 융합 | 링크 |
3 | 가변 함수 | 링크 |
4 | 내부적으로: 시스템 호출 | 링크 |
5 | C 함수의 문자열 리터럴 길이 결정 | 링크 |
6 | Python에서 어셈블리 언어 호출하기 | 링크 |
7 | 원자적 연산 | 링크 |
8 | 점프 테이블 | 링크 |
9 | argv | ASM 코드 |
10 | 스핀락 | 링크 |
- | 디버깅 강의 | PPTX |
바로 위에 표시된 것처럼 매크로 모음은 여기에서 찾을 수 있습니다.
다음은 귀하의 숙달을 위한 도전을 제공하는 몇 가지 프로젝트 사양입니다. 다음은 알파벳 순서로 매우 간략한 설명입니다.
아마도 이 문제를 해결하기 전에 먼저 완전히 설명된 FIZZBUZZ 프로그램을 확인하십시오.
그렇다면 이것을 첫 번째 프로젝트로 시도해 보세요. 일부 빈 줄과 주석을 포함하면 35줄이 됩니다.
DIRENT 프로젝트는 어셈블리 언어에서 복잡한 struct
사용하는 방법을 보여줍니다.
PI 프로젝트는 부동 소수점 명령어를 보여줍니다. 이 프로그램은 "목표물에 다트를 던집니다". "던지는" 총 다트 수 대비 "목표물에 맞는" 다트 수를 추적하여 PI의 근사치를 계산합니다.
SINE 프로젝트는 부동 소수점 수학과 기능을 강조합니다.
SNOW 프로젝트는 1970년대 기술을 사용하여 간단한 입자 시스템을 애니메이션화합니다. 이 프로젝트는 복잡한 문제를 단순한 부분으로 나누는 합리적인 설계 프로세스를 보여줍니다.
WALKIES는 포인터 역참조를 통해 반복하는 모습을 보여주는 귀엽고 작은 애니메이션을 제공합니다.
컴퓨터 과학 분야에서 Perry Kivolowitz의 경력은 50년이 채 되지 않습니다. 그는 주로 하드웨어, 이미지 처리 및 시각 효과(영화 및 TV용)와 관련된 5개 이상의 회사를 설립했습니다. Perry는 Babylon 5의 파일럿 에피소드인 The Gathering에 대한 작업으로 에미상을 받았습니다. 나중에 그는 SilhouetteFX, LLC의 동료들과 함께 엔지니어링 부문 에미상을 받았습니다. SilhouetteFX는 로토스코핑, 페인트, 추적, 2D에서 3D로의 재구성, 합성 등 거의 모든 중요한 영화에 사용됩니다.
1996년에 Perry는 Shape Driven Warping and Morphing의 발명으로 과학 및 기술 공로로 아카데미 상을 받았습니다. 이는 Forrest Gump, Titanic 및 Stargate의 많은 유명한 효과를 담당하는 기술입니다.
223년은 Perry가 대학 수준에서 컴퓨터 과학을 가르친 지 19년이 되었고, UW Madison에서 10년, 현재 Carthage College에서 8년이 넘었습니다.
어셈블리 언어는 다음 ISA(연대순)에서 일한 Perry의 열정입니다.
유니백 1100
디지털 이큅먼트 코퍼레이션 PDP-11
디지털 장비 공사 VAX-11
모토로라 68000
AARCH64로 시작하는 ARM
이 작품을 나의 아내 Sara와 아들 Ian과 Evan에게 헌정했습니다.
Perry는 CS 1, CS 2, 데이터 구조, 네트워킹, 운영 체제 및 컴퓨터 조직 수업에 적합한 약 200개의 프로그래밍 프로젝트 라이브러리를 만들었습니다. CS교과서(또는 기타 CS 관련 콘텐츠) 출판사에서 도서관 구입에 관심이 있는 경우 문의해 주세요.
또한 코더를 위한 좀비 소설 Get Off My L@wn도 확인해 보세요.
읽으셨군요... 엘리트 프로그래머 Doug Handsman은 그의 아내 Ruth Ann의 고향인 북부 위스콘신으로 은퇴했습니다. 그러다가 종말이 일어납니다. 버머.
70개 이상의 리뷰와 함께 5점 만점에 4.3점을 받은 이 책은 재미있게 읽을 수 있고 비용도 거의 들지 않습니다.