지난 글에서는 논리연산 명령어에 대해 정리하였다.
논리 연산 명령어에는 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 에 넣는 효과를 보았다.
이번 글에서는 비트 연산 명령어에 대해 정리해보고자 한다.
Bitwise Synthetic Instruction
우선 비트를 직접 조작하는 명령어를 알아보자.
비트를 직접 조작할 때는 '마스크' 비트를 같이 활용한다.
마스크 비트는 조작할 비트를 1로 표시하고, 조작하지 않을 비트를 0으로 표시하여 조작할 비트에만 조작 연산이 적용되도록 표시 (마스킹) 한다.
비트를 조작하는 명령어는 아래와 같이 4가지가 있다.
bset
bit set, 마스킹한 비트를 1로 셋하는 명령어이다.
bset A, R = or R, A, R
A가 마스킹비트를 나타내며, 상수와 숫자 모두 가능하다.
bset 에서는 A 가 앞에 오는 것에 주의하자.
or 연산을 이용하므로 A 에서 1 로 마스킹한 비트는 R 의 값에 상관없이 모두 1로 세팅된다.
bclr
bit clear, 마스킹한 비트를 0으로 클리어하는 명령어이다.
bclr A, R = andn R, A, R
A 로 마스킹한 곳의 비트가 0이 되고 and 연산을 수행하므로,
마스킹한 비트는 R 의 값에 상관없이 모두 0으로 클리어된다.
btog
bit toggle, 마스킹한 비트를 반전시키는 명령어이다.
not 연산에서 본 것과 유사하게 xor 연산이 이용된다.
btog A, R = xor R, A, R
마스킹한 비트가 1이라면 R 의 비트가 1 일 때 1 xor 1 = 0 으로 바뀌고, R 의 비트가 0 일 땐, 0 xor 1 = 1 로 바뀐다.
btst
bit test, 마스킹한 비트를 테스트 (cc코드 발생) 한다.
btst A, R = andcc R, A, %g0
and 연산을 이용하므로, 마스킹한 비트들이 모두 0이라면 0, 하나라도 1이 있으면 0이 아닌 값이 나온다.
따라서 cc 코드에서 Z 값을 체크함으로서 Z= 0 이면 마스킹된 비트가 모두 0, 아니라면 마스킹된 비트중에 1이 적어도 하나 있음을 알 수 있다.
이런 테스트 명령어들은 분기 조건을 체크할 때 사용된다.
Bit Shfit Operation
이번엔 비트 쉬프트 연산을 알아보자.
이 연산자들은 기계 명령어들로 직접 기계어로 번역된다.
비트 쉬프트 연산은 3가지 종류가 있다.
하나씩 정리해보자.
sll
shift left logical, 비트를 왼쪽으로 한칸씩 옮기는 명령어이다.
제일 왼쪽에 있는 비트는 무조건 버리고, 오른쪽에는 0을 추가한다.
sll R, A, D 형태로 사용한다.
R, D 는 레지스터 주소가 들어가고, A 는 레지스터 또는 상수로서, 얼마나 왼쪽으로 옮길지를 명시한다.
srl
shift right logical, 비트를 오른쪽으로 한칸씩 옮기는 명령어이다.
제일 왼쪽에 0을 추가하고, 제일 오른쪽 비트는 버린다.
unsigned 일 때는 문제가 없지만, signed 일 때는 MSB 가 부호를 나타내기 때문에 문제가 생긴다.
그래서 signed 일 때는 다른 명령어로 bit shift 를 실행한다.
sra
shift right arithmetic, 비트를 오른쪽으로 한칸 옮기되, MSB 비트를 그대로 유지한다.
따라서 signed 데이터의 부호를 그대로 유지하면서 비트를 옮길 수 있다.
이것으로 비트 연산자까지 정리를 마쳤다.
다음 글에서는 지금까지 정리한 연산자를 활용한 분기에 대해 정리해보겠다.
'CS > 어셈블리' 카테고리의 다른 글
[SPARC] 18. Branch Delay Slot 의 발생 이유 (0) | 2023.10.17 |
---|---|
[SPARC] 17. 분기 명령어 (0) | 2023.10.15 |
[SPARC] 15. 논리 연산 명령어 (0) | 2023.10.14 |
[SPARC] 14. 곱셈과 나눗셈 그리고 서브루틴 (2) | 2023.10.11 |
[SPARC] 13. Hardware & 큰 수 연산 (0) | 2023.10.11 |