seven05
[CSAPP] 3.1~3.6 어셈블리어 공부 본문
어셈블리어 부분을 공부하다가 이해하기 힘들었거나 중요하다고 생각됐던 부분들을 정리해 보려고한다
레지스터: 이름이 왜 rax, rbx, ... 하다가 갑자기 r8,r9,r10 일까? -> 원래 8개 쓰다가 16개가 되서
그럼 왜 32개로 늘리지않을까? -> 늘려도 10%의 퍼포먼스 향상밖에 없는데 레지스터 이름 더 표기하려면 비트하나더씀
%rsp 만 스택포인터 레지스터로 특별한 역할이 남아있다.
movq 명려어는 단순히 값을 복사함 단, 두개의 값이 모두 메모리 주소이면 안됨 (movq의 q는 quadword의 약자로 과거에서 발전하는 과정에서 붙혀짐)
앞에서 봤었지만 레지스터를 괄호로 감싸면 레지스터의 값을 메모리 주소로 인식하라는 뜻 (포인터 역참조)
어셈블리어 연산자 중에 헷갈렸던 부분: 산술연산과 논리연산으로 쓰이는 비트 시프트가 왼쪽으로 할때는 같고 오른쪽으로 할때는 다르다. (사실 이부분은 앞부분이였던 비트연산에서 이유가 설명되어있지만 어셈블리어 연산자를 보고 깨달음)
조건코드: 프로세서가 조건문을 다루는 방법
프로세서는 16개의 레지스터를 갖고 있고, 거기에 더해 %rip(instruction pointer) 레지스터가 있다. 여기에는 현재 수행할 명령의 주소를 가르킨다.
- CF(Carry Flag)는 최근 명령에서 unsigned 오버플로우가 나면 1로 세팅된다.
- ZF(Zero Flag)는 최근 명령어의 결과값이 0이면 1로 세팅된다
- SF(Sign Flag)는 최근 명령어의 결과값이 음수면 1로 세팅된다.
- OF(Overflow Flag)는 최근 명령에서 signed 오버플로우가 나면 1로 세팅된다.
조건코드는 cmpq와 같은 특정 명령어에 반응, setg dst 는 ~(SF^OF)&~ZF의 값이 1이면 dst의 최하위 바이트를 1로 만든다. 저 논리식은 마지막 계산이 >가 나왔을때라고 한다.
%al은 %rax의 최하위 바이트를 말함, 위의 어셈블어는 %rdi > %rsi 였을때 %al을 1로 만듬.
movzbl 은 %al의 값을 %eax에 복사하고 이때 %al 왼쪽의 비트를 전부 0으로 초기화한다 (%eax는 $rax의 최하위 32비트를 말한다). %rax의 경우에는 x86의 기본 동작으로 초기화됨 (레지스터에 32비트 수가 세팅되면 나머지 32개의 비트들은 전부 0이 된다)
조건문: j로 시작하는 명령어들은 타겟주소를 받으면 그 주소로 점프 (점프: 그 주소부터 다음명령을 수행)
jle 을 만족하면 L4로 점프하고 아니면 그대로 진행된다는것을 알수있다. 하지만 여기서 추가적인 내용이 있었다.
프로세서는 보통 중간에 조건문이 등장하면 조건을 계산하기 전에 한쪽을 미리 계산해놓는 분기 예측(branch prediction)이라는, 굉장히 성공적인 기법을 쓴다.(98퍼센트 정도된다하는데 이유는 모름 나중에 공부하자) 하지만 틀릴경우 약 40 명령어 사이클을 낭비하게 된다(왜 이정도인지 모름 이것도 찾아보자)
따라서 계산이 간단하다면 둘다 미리 계산해놓는게 더 효율적일 때도 있다. 아래 코드가 그러하다
cmovle는 조건코드를 비교해서 ≤ 면 mov 명령을 실행한다. x ≤ y면 %rdx의 값 (y - x)가 %rax로 덮어씌워지는걸 볼 수 있다. x > y 면 cmovle 가 일어나지 않으니 미리 계산해둔 x - y가 리턴값이 된다.
반복문:
반복문을 풀어서 goto로 적어본뒤에 goto 자리에 jump 명령어가 들어온다고 생각하면 어셈블리어로 모두 구현할수있다.
while은 test를 먼저 실행하고 for는 init을 먼저 실행한뒤에 while문의 형태로 바꿀수있다.
switch문:
얘는 if문과 비슷하게 구현될것이라고 생각했지만 상당히 다르게 구현되었다.
너무 내용이 많아서 결과만 적자면 다른 제어문과는 다르게 점프테이블이라는걸 생성해 구현된다는 것이다.
점프 테이블을 쓰지 않는다면 cmp와 jmp명령어를 반복해서 쓸텐데, 이건 if문을 여러번 쓰는것과 크게 다르지 않다.
이 책의 저자가 교수인 카네기멜론 대학에서 어셈블리어를 연습하는 실습인 bomblab을 제공하지만 일정상 직접 해볼수가없어서 나중에 해볼수있으면 좋을거같다.
csapp 실습 코드: bmadone/csapp-labs: Computer Systems: A Programmer's Perspective – Lab Assignments (github.com)
GitHub - bmadone/csapp-labs: Computer Systems: A Programmer's Perspective – Lab Assignments
Computer Systems: A Programmer's Perspective – Lab Assignments - GitHub - bmadone/csapp-labs: Computer Systems: A Programmer's Perspective – Lab Assignments
github.com
실습 유의물을 한국어로 번역해주신분도 있었다.
csapp-labs-korean-translation/bomblab/폭탄랩.pdf at main · Daqsa/csapp-labs-korean-translation
Contribute to Daqsa/csapp-labs-korean-translation development by creating an account on GitHub.
github.com
'SW JUNGLE 9기 > CSAPP' 카테고리의 다른 글
[CSAPP] 8. 예외적인 제어흐름(8.1,8.5) (0) | 2024.09.05 |
---|---|
[CSAPP] 7.Linking 링킹 (7.1,7.4,7.9) (1) | 2024.09.04 |
[CSAPP] 3.7~3.9,11 어셈블리어가 함수와 배열을 표현하는 방법 (3) | 2024.09.04 |
[CSAPP] 부동소수점 부분 공부하다가 발견한 신기한 알고리즘 1/sqrt(x) (2) | 2024.09.04 |