728x90
CSAPP
3.5 산술연산과 논리연산
- 각 인스트럭션 클래스는 네개의 서로 다른 크기의 데이터 연산을 갖는다. 연산들은 4개의 그룹으로 나누어진다.
- 유효주소 적재
- 단항(Unary)
- 이항(Binary)
- 쉬프트(Shift)
- 이항연산은 두개의 오퍼랜드를 가지는 반면, 단항연산은 한개의 오퍼랜드를 갖는다.
3.5.1 유효주소 적재(Load Effective Address)

- 유효주소 적재 인스트럭션 leaq는 실제로는 movq 인스트럭션의 변형이다.
- 메모리에서 레지스터로 읽어들이는 인스트럭션의 형태를 갖지만, 메모리를 전혀 참조하지 않는다. 이 인스트럭션의 첫번째 오퍼랜드는 일종의 메모리 참조처럼 보이지만, 가리키는 위치에서 읽기를 수행하는 대신에 유효주소를 목적지에 복사한다.
- 이 인스트럭션은 나중에 메모리 참조에 사용하게 되는 포인터를 생성하기 위해 사용된다. 또, 일반적인 산술연산을 간결하게 설명하기 위해서 사용된다.
- 컴파일러는 자주 실제 유효주소 계산과 무관한 경우에 leaq를 적절히 사용하곤 한다.
- 목적 오퍼랜드는 반드시 레지스터만 올 수 있다.
- leaq는 일반적으로 간단한 산술연산을 사용한다.
3.5.2 단항 및 이항연산
- 두번째 그룹에서의 연산은 하나의 오퍼랜드가 소스와 목적지로 동시에 사용되는 단항 연산이다.
- 이 오퍼랜드는 레지스터나 메모리위치가 될 수 있다.
- ex) incq (%rsp) : 스택 탑의 8바이트 원소 값 증가
- 세번째 그룹 이항연산자로 구성되며, 두번째 오퍼랜드는 소스이면서 목적지로 사용된다.
- C언어 에서 x+=y 같은 문장과 유사하다. 소스가 먼저오고 목적지가 나중에 오는 점에 유의.
- 비교환성(noncommutative) 연산으로 특이하게 보인다.
- 연산의 순서를 바꾸면 부호가 반대가 되는 성질
- ex) subq %rax %rdx ⇒ rdx - rax
- 첫 번째 오퍼랜드는 상수나 레지스터 , 메모리 위치가 올 수 있다.
- 두 번째 오퍼랜드는 레지스터나 메모리가 올 수 있다. MOV인스트럭션처럼 두개의 오퍼랜드가 모두 메모리 위치가 될 수는 없다.
- 두 번째 오퍼랜드가 메모리 위치일 때 프로세서가 메모리에서 값을 읽고, 연산을 하고 그 결과를 다시 메모리에 써야 한다는 점에 유의
3.5.3 쉬프트 연산(Shift)
- 마지막 그룹은 쉬프트 연산으로 구성되며, 쉬프트 하는 크기를 먼저 주고, 쉬프트할 값을 두 번째로 준다. 산술과 논리형 우측 쉬프트가 모두 가능하다. 여러가지 쉬프트 인스트럭션들은 쉬프트할 양을 즉시 값이나 단일 바이트 레지스터 %cl로 명시할 수 있다.(이 인스트럭션들은 이 특정 레지스터만을 오퍼랜드로 허용하는 점이 일반적이지 않다.)
- x86-64에서는 w비트 길이의 데이터 값에 적용하는 쉬프트 연산은 레지스터 %cl의 하위 m비트로 쉬프트 양을 결정하며 2^m = w 관계가 성립한다.
- 좌측 쉬프트 인스트럭션에는 두가지 이름이 있다 : SAL, SHL 이들은 모두 동일한 효과를 내며, 우측에서 부터 0을 채운다. 우측 쉬프트 인스트럭션은 SHR이 논리 쉬프트(0으로 채운다)을 수행하는 반면 SAR이 산술쉬프트(부호 비트를 복사해서 채운다)를 수행한다는 점에서 차이가 있다.
- 쉬프트 연산의 목적 오퍼랜드는 레지스터나 메모리 위치가 될 수 있다.
3.5.4 토의
- 대부분 인스트럭션들은 비부호형과 2의보수 산술 연산에 사용될 수 있다.
- 오직 우측 쉬프트만이 부호형과 비부호형 데이터를 구분하는 인스트럭션을 요구한다. 이것이 부호형 정수 산술연산을 구현하는 방식으로 2의 보수 산술연산을 선호하는 주요특징이다. 일반적으로 컴파일러는 각각의 레지스터를 여러가지 프로그램의 값을 저장하는데 사용하고, 레지스터들 간에 프로그램 값을 이동하는데 사용한다.
3.5.5 특수 산술 연산
- 두개의 64비트 부호형 또는 비부호형 정수들 간의 곱셈은 결과값을 표시하기 위해 12비트를 필요로 한다. x86-64 인스트럭션 집합은 128 비트 숫자와 관련된 연산에 대해서는 제한적인 지원을 제공한다. imlq
- IMUL 인스트럭션 클래스의 멤버. 이 형식은 두 개의 64비트 오퍼랜드로 부터 64비트 곱을 생성하는 2 오퍼랜드 곱셈 인스트럭션을 제공한다.
- 추가적으로 x86-64에서는 두개의 다른 ‘단일 오퍼랜드’ 곱셈 인스트럭션을 제공하며, 두 64 비트값의 완전한 128비트 곱을 계산한다. - 하나는 비부호형 (mulq) 하나는 2의 보수 (imulq) 곱셈. 이들 모두 한개의 인자는 레지스터 %rax에 보관해야 하고, 다른 한개는 인스트럭션 소스 오퍼랜드로 주어진다. 곱은 %rdx(상위 64비트) 와 %rax(하위 64비트)에 저장된다.
3.6 제어문
- 보통 C와 기계어 인스트럭션들은 모두 프로그램에 나타나는 순서대로 순차적으로 실행된다.
- 기계어 인스트럭션들의 실행순서는 JUMP인스트럭션으로 변경할 수 있다.
- 점프 인스트럭션은 때에 따라서는 어떤 시험의 결과에 따라 프로그램의 다른 일부분으로 제어를 넘겨준다.
3.6.1 조건코드

- 정수 레지스터들과 함께 CPU는 가장 최근 산술 또는 논리연산의 특성을 설명하는 단일비트조건 코드로 구성된 레지스터들을 운영한다. 이 레지스터들은 조건부 분기를 수행하기 위해 시험될 수 있다.
- CF(Carry Flag) : 가장 최근의 연산에서 가장 중요한 비트로부터 받아 올림이 발생한 것을 표시. 비부호형 연산에서 오버플로우를 검출 할 때 사용.
- ZF(Zero Flag) : 가장 최근 연산의 결과가 0인 것을 표시
- SF(Sign Flag) : 가장 최근 연산이 음수를 생성한 것을 표시
- OF(Overflow Flag) : 가장 최근 연산이 양수/음수의 2의 보수 오버플로우를 발생 시킨것을 표시
- leaq 인스트럭션은 주소 계산에 사용하기 위한 것이므로 조건 코드를 변경하지 않는다.
- 반면 그림에 나열된 모든 인스트럭션은 조건 코드 값을 변경한다.
- CMP 인스트럭션들은 두 오퍼랜드의 차에 따라 조건코드를 설정한다.
- 이들은 목적지를 갱신하지 않고 조건코드를 설정 한다는 점을 제외하고는 SUB 인스트럭션과 같은 방법으로 동작한다.
- 이 인스트럭션들은 만일 두 오퍼랜드가 같으면 영플래그를 1로 설정한다 다른 플래그들은 두 오퍼랜드의 순서관계를 결정하는데 사용될 수 있다.
3.6.2 조건코드 사용하기
- 조건코드를 이용하는 보편적인 세가지 방법
- 조건코드의 조합에 따라 0 또는 1을 한 바이트에 기록
- 조건에 따라 프로그램의 다른 부분으로 이동하는 방법
- 조건에 따라 데이터를 전송하는 방법
- SET인스트럭션 조건코드의 일부 조건에 따라 하나의 바이트를 0 또는 1로 기억한다. 이들 인스트럭션은 서로 다른 접미어를 가지고, 이에 따라 다른 조건코드의 조합을 사용하여 서로 다른 동작을 한다. 여기서 접미어는 오퍼랜드 크기가 아니라 조건코드의 어떤 조합을 사용 할 것인지 나타내는 점이다.
- SET 인스트럭션은 목적지로 하위 단일 바이트 레지스터 가운데 한 개나 단일 바이트 메모리 주소를 사용하며, 이 바이트를 0이나 1로 기록한다.
3.6.3 점프 인스트럭션
- 점프 인스트럭션은 프로그램이 완전히 새로운 위치로 실행을 전환하도록 한다. 이들 점프의 목적지는 일반적으로 어셈블리 코드에서는 레이블(label)로 표시한다.
- 목적 코드파일을 만들기 위해서 어셈블러는 모든 레이블이 붙은 인스트럭션들의 주소를 결정하고, 점프 인스트럭션의 일부분인 ‘점프 목적지(Jump Target) : 목적지 인스트럭션의 주소’ 를 인코딩한다.
- jmp 인스트럭션은 점프 목적지가 인스트럭션의 일부로 인코딩되는 경우에는 직접 점프를, 점프 대상을 레지스터나 메모리 위치로부터 읽어 들어야 하는 경우 간접 점프를 사용한다.
- 직접점프는 점프대상을 레이블로 프로그램 내에 작성한다.
- 간접점프는 메모리 오퍼랜드 중의 하나를 이용한 오퍼랜드 식별자를 합쳐서 작성한다.
- jmp *%rax : rax에 값을 점프 목적지로 활용
- jmp*(%rax) = %rax에 저장된 값을 읽기 주소로 사용하여 메모리에서 점프 목적지 사용
3.6.4 점프 인스트럭션 인코딩
- 점프를 인코딩하는 여러가지 방법 중 일반적인 방법 PC상대적(PC relative) 방법
- 대상 인스트럭션과 점프인스트럭션 주소와의 차이를 인코딩 한다.
- 두 번째 방법은 ‘절대’주소를 제공하는 방법
- PC상대 주소지정을 수행할 때 프로그램 카운터의 값은 점프 인스트럭션 자신의 주소가 아니라 점프 다음에 나오는 인스트럭션의 주소가 된다.
- PC - 상대 방식으로 점프 목적지를 인코딩하면, 인스트럭션들이 간결하게 인코딩(2바이트) 될 수 있고, 목적코드는 수정없이 메모리상 다른 위치로 이동 될 수 있다.
728x90
'책 > CSAPP' 카테고리의 다른 글
CSAPP 3.8 (1) | 2024.01.23 |
---|---|
CSAPP 3.6.5 - 3.7 (1) | 2024.01.22 |
CSAPP 3.4 (0) | 2024.01.20 |
CSAPP 3.1 - 3.3 (0) | 2024.01.20 |
CSAPP 1.7 - 1완 (0) | 2024.01.20 |