CS/어셈블리

CS/어셈블리

[SPARC] 21. 메모리

메모리 개요 메모리는 프로그램의 명령어와, 그 명령어가 사용할 데이터가 들어있는 공간이다. (폰 노이만 구조에서는 프로그램의 명령어도 데이터이다.) 저장 단위는 byte 단위이며, 레지스터와 달리 4byte로 고정되지 않고 1, 2, 4, 8 byte 등으로 유동적인 사이즈로 저장할 수 있다. 하지만 레지스터가 한번에 4byte 씩 파악하기 때문에, 명령어의 사이즈는 4byte 로 고정되어있다. 메모리 접근 메모리에 접근하여 데이터를 읽고 쓰는 명령어는 기본적으로 아래와 같은 형태를 띈다. Load, 메모리의 데이터를 불러와(loading) 레지스터에서 읽는 것 ld [메모리주소], 레지스터주소 메모리 -> 레지스터 순서로 읽으면 되니 이해가 간단하다. 메모리주소는 R + A 형태로 표현되고, [ ] 는..

CS/어셈블리

[SPARC] 20. switch - case 구현하기

지난 글에서는 분기 최적화에 대해 정리하였다. 분기 최적화를 하는 방법에는 from before, from after, annulled branch 3가지가 있었다. from before 은 분기 명령어 이전에 실행되는 명령어를 가져오는 것으로, 보통 mov 명령어를 이용한 레지스터 값 세팅을 가져올 수 있다. from after 은 분기 명령어 이후에 실행되는 명령어를 가져오는 것으로, 보통 분기 이후 실행되는 명령어 중, 분기 여부에 상관없이 반드시 실행되는 명령어를 당겨올 수 있었다. annulled branch 는 분기를 할 때는 delay slot 명령어를 실행하고, 분기를 하지 않을 때는 delay slot 명령어를 실행하지 않는 분기 명령어로서, 반드시 분기 후 첫 명령어를 delay slo..

CS/어셈블리

[SPARC] 19. Delay Slot Optimization

지난 글에서는 Branch Delay Slot 이 발생하는 이유를 파이프라이닝 과정을 따라가보며 살펴보았다. 요약해보면, Branching 여부는 E 단계에서 결정되기 때문에, E 단계에서 분기를 하더라도, E 단계 시점의 F 단계에 있던 명령어가 파이프라인에 남아 계속 실행되는 문제 때문에 이를 비워둠으로써 Delay Slot 이 발생하였다. 이번 글에서는 이렇게 Delay Slot 을 비워두지 않고, 다른 명령어로 채워 활용하는 방법. Delay Slot Optimization 에 대해 정리해보고자 한다. 최적화 개요 그렇다면 어떻게 분기 명령어를 쓴 직후, nop 를 넣지 않고 최적화를 할 수 있을까? nop 대신 분기에 (전체 코드 실행에) 영향을 주지 않는 다른 명령어를 넣으면 된다. 즉, de..

CS/어셈블리

[SPARC] 18. Branch Delay Slot 의 발생 이유

지난 글에서는 분기 명령어의 종류와 사용 방법, 그리고 예제들을 살펴보았다. 간단하게 정리하면 분기 명령어 중 조건 분기와 무조건 분기는 CC 코드를 이용해 분기 명령어에 적힌 조건을 파악하기 때문에, 명령어를 실행시키기 전에 반드시 조건식의 CC 코드를 발생시켜 두어야 했다. 그리고 분기 명령어의 실행 직후에는 Branch Delay Slot 이 반드시 발생하였다. 이번 글에서는 Branch Delay Slot 이 발생하는 이유를 실제 명령어의 실행 파이프라인을 따라가보며 정리해보고자 한다. 다음과 같은 명령어를 순차적으로 실행시킨다고 하자. ble next_r - A add R1, R2, R3 - B mov 130, R4 - C ... next_r: - D add R3, R4, R1 set str, ..

CS/어셈블리

[SPARC] 17. 분기 명령어

지난 글까지 산술 명령어, 논리 명령어, 비트 명령어를 정리하였다. 이번 글부터는 분기 명령어에 대해 정리하고자 한다. Flow Control In Assembly 흐름제어는 한다면 코드가 위에서부터 아래로 한 줄씩 실행되는 것이 아니라, 특정 위치로 건너가 실행하도록 설정하는 것을 의미한다. C언어에서 흐름 제어 키워드를 생각을 해보면 아래와 같은 키워드가 있다. 반복 : for, while, do while 분기 : switch, if, else 기타 : goto, 함수 그리고 강제로 이동하는 goto 문을 제외하면, 건너 뛸지 말지 여부를 결정하기 위한 '조건 체크'가 반드시 필요하다. 조건 체크는 비교 연산자를 사용한다. (!=, ==, , ...등등) 어셈블리의 관점에서 흐름 제어도 마찬가지이다..

CS/어셈블리

[SPARC] 16. 비트 연산 명령어

지난 글에서는 논리연산 명령어에 대해 정리하였다. 논리 연산 명령어에는 and, or, xor 과 andn orn xnor 이 있었고, 각 명령어마다 cc 를 생성하는 명령어가 따로 있었다. 논리 연산에서 CC 는 N, V 만 사용한다. 합성 명령어로는 not, clr, tst, mov 와 같은 명령어가 있었다. not A = xnor A, %g0, A 로서 특정 비트와 1 의 xor 연산을 통해 0을 1로 1을 0으로 바꾸어 주었다. clr 은 0 과 and 연산을 함으로서 모든 비트를 0으로 초기화 시키고, tst 는 0과 orcc 를 한 값을 %g0 에 저장시키므로서 연산 결과를 버리고 cc 만을 보는 명령어였다. mov A, B 는 or %g0, A, B 연산으로 대체되어 A 를 그대로 B 에 넣..

CS/어셈블리

[SPARC] 15. 논리 연산 명령어

지난 글까지 산술 명령어를 정리하였다. 산술 명령어 (덧셈 뺄셈, 곱셈, 나눗셈, 나머지) 연산 중, 덧셈과 뺄셈은 기계 명령어로 구현되고, 특히 뺄셈은 2의 보수를 이용하여 덧셈 연산되는 것이 특징이었다. 연산 데이터에는 signed integer 와 unsigned integer 가 있었는데, 덧셈 / 뺄셈시 각 데이터 종류별로 연산 결과에서 나오는 CC의 의미가 달라지게 되었다. unsigned 데이터 연산에서는 Carry 가 중요한 의미를 지녔으며, 덧셈시 오버플로우, 뺄셈시 캐리가 존재한다면 A = B 의미를 지니는 것으로 해석하게 되었다. signed 데이터 연산에서는 oVerflow 와 Negative 코드를 통해 연산 결과의 부호를 알아낼 수 있고, 이를 통해 두 수의..

CS/어셈블리

[SPARC] 14. 곱셈과 나눗셈 그리고 서브루틴

지난 글에서는 큰 수 덧셈과 뺄셈에 대하여 정리하였다. 간단하게 요약하면 큰 수를 더하고 뺄 때는 cc 명령어를 사용해 캐리를 넘겨주고, x 명령어를 사용해 캐리를 받아 여러 레지스터를 사용해 큰 수를 연산하였다. 이번 글에서는 SPARC 프로세서의 곱셈과 서브루틴에 대해 정리하고자 한다. 곱셈 곱셈은 기본적으로 bitshift 와 덧셈의 조합이다. 예를 들어 101 x 204 를 한다고 해보자. 초등학교 때로 돌아가 어떻게 큰 수의 곱셈을 했는지 따져보면 101 x 4 x 1 101 x 0 x 10 101 x 2 x 100 이렇게 곱셈을 하고 다 더해서 곱셈을 계산했던 기억이 있을 것이다. 컴퓨터도 마찬가지로 이진수에 대해 위와같은 연산을 함으로써 곱셈을 구현한다. 이때 1, 10 100 처럼 1, 2..

CS/어셈블리

[SPARC] 13. Hardware & 큰 수 연산

지난 글에서는 Unsigned Integer / Signed Integer 연산에 대해 정리하였다. Unsigned 연산에서는 덧셈 뺄셈시 Carry가 중요했다. 만약 덧셈을 했는데 Carry 가 발생했다면 오버플로우가 발생한 것이고, 뺄셈을 했는데 Carry가 발생했다면 빼는 수가 빼지는 수보다 더 큰 것임을 의미했다. (그래서 이것이 subcc 를 비교에 사용하는 이유이다.) Signed 연산에서는 덧셈 뺄셈시 Overflow 가 중요했다. 만약 양수와 양수를 더했는데 음수가 나온 것처럼 N 이 활성화 되었다면 오버플로우가 발생한 것이고, 원래 의도된 계산 값이 양수임을 알 수 있다. 만약 음수와 음수를 더했는데, 양수가 나온 것처럼 N 이 활성화되지 않았다면, 오버플로우가 발생한 것이고, 원래 의도..

CS/어셈블리

[SPARC] 12. Unsigned/Signed Integer & Carry / Overflow

지난 글에서는 산술 연산과 그 결과에 따라 발생하는 Condition Code 의 종류에 대해 정리하였다. 산술 연산에 대표적으로 add 와 sub 가 있는데, 명령어에 cc 옵션(?)을 붙인 addcc, subcc 명령어는 연산 후 condition code를 반환한다. Condition Code에는 Z, N, V, C 4가지가 있었으며, Z는 연산 결과가 0인지 판별하고, N 은 연산 결과가 음수인지 판별한다. V는 오버플로우 여부를 판별하고, C는 캐리를 반환한다. 이번 글에서는 4가지 코드 중 V 와 C 에 대해 조금 더 자세하게 정리해보고자 한다. 그리고 이를 위해 먼저 Unsigned Integer 와 Signed Integer 에 대해 정리해보겠다. Unsigned Integer / Sign..

에버듀
'CS/어셈블리' 카테고리의 글 목록 (3 Page)