컴퓨터 구조 명령어 정리

2024. 10. 20. 12:11카테고리 없음

명령어들을 정리해 봅시다.

 




사칙연산

add t1, t2, t3 - R
addi t1, t2 , 0x0001 - I 
addu t1, t2, t3 - R

sub t1, t2, t3 - R
subi t1, t2 , 0x0001 - I
subu t1, t2, t3 - R

mult t1,t2 - R
multu t1, t2 - R
mfhi t3 - R # 오버플로우 확인 
mflo t4 - R # 결과값 

div t1,t2 - R
divu t1, t2 - R
mfhi t3 - R # 나머지 
mflo t4 - R # 몫 

 




논리연산

and t1, t2 , t3 # 비트끼리 비교하여 1,1 일 경우에 1 이외는 모두 0 
or t1, t2, t3 # 비트끼리 비교하여 0, 0 일 경우 0 이외는 모두 1
nor t1, t2, t3 # 1은 0으로 0은 1로 뒤바꿈
++ not이 없는이유 nor t1, t2,t2 => not t2 를 t1 에 저장

andi t1, t2 0x0001 - I 
ori t1, t2 0x0001 - I
srl t1, t2 5bit(num) - R # 비트를 오른쪽으로 숫자만큼 이동 2^num 만큼 나눈 효과
sll t1, t2 5bit(num) - R # 비트를 왼쪽으로 숫자만큼 이동 2^num 만큼 곱한 효과
++ srl은 왜 숫자 다루는데 I format이 아닌가요!! - 더 효율적이라 shift 칸이 괜히 있는게 아님




포맷

R - format : op( 6 ) rs( 5 ) rt( 5 ) rd( 5 ) shamt( 5 ) funct( 6 )  
## rd는 목적지, 저장될 공간으로 2진법으로 변환시에 레지스터 중 가장 뒷자리
## 레지스터 간의 연산이나 관계를 나타냄 
I - format : op( 6 ) rs( 5 ) rt( 5 ) constant( 16 )
## rt는 목적지, 저장될 공간으로 2진법으로 변환시에 레지스터 중 가장 뒷자리
## 레지스터와 상수의 관계를 나타냄
J - format : op( 6 ) address ( 26 )
## 이동할 링크를 나타냄



저장,불러오기

sw t1, num( t2 ) - I # t1에 t2 + num을 저장한다. num은 address이다.

lw t1, num( t2 ) - I # t1에 t2 + num 메모리 주소에 있는 값을 가져온다.

la t1 , Label - I # t1에 라벨의 주소를 가져온다.



메모리 저장 방법

.byte 1 # 글자 그대로 바이트 이다. 8bit 이니 메모리 그림에서는 0x01 처럼 보인다.
.word 1 # 문자 숫자 다 저장한다. 32bit로 메모리 그림에서는 0x01를 4개 차지한 것으로 보인다.
## word는 4byte 단위로 저장되기에 바이트 다음에 word가 올경우 빈 공간이 생길 수 있는데 이를 alignment 라고 한다.

J문 ( 점프 )

j L1 - J
jr $31($ra) - R
$ra 는 레지스터에 직접 주소를 할당한다.

예) lui $ra , 0x0040
     or $ra , 0x0024

jal L1 - J # j와의 차이점 : 이동전 자신의 PC + 4를 $31($ra)에 저장하고 이동한다

 J와 jal 에서의 L1을 구하는 방법을 알아보자 

위 2개는 J 포멧으로 충분한 크기를 갖고있기에
자신이 갈 주소의 상위 4bit 하위 2bit를 제거하고 
26bit를 만들어 링크로써 사용한다.

예) [00400024] => 0000 0000 0100 0000 0000 0000 0010 0100
                          L1 =  0000 0100 0000 0000 0000 0010 01


beq t1,t2,L1 - I # t1 == t2 -> L1
bne t1,t2,L1 - I # t1 != t2  -> L1

beq와 bne에서의 L1을 구하는 방법을 알아보자

beq와 bne는 로컬하다. 즉 옮길 위치가 멀지 않다는 뜻이다.
따라서 어디로 이동할 것인지는 자신의 PC 값에서 얼마나 떨어져 있는지를 기준으로
L1의 링크를 넣을 수 있는데 예시를 들어보자.

pc
[00400024]  -1
[00400028]  beq t1,t2, L1 
[0040002c]  +1
[00400030]  +2

위와 같이 존재한다면 링크는 가고 싶은 위치에 따라 
24 : 자신보다 한칸 위이니 L1 = -1 * 4 -> beq t1,t2, -4
2c : 한칸 아래이니 L1 = 1 * 4 -> beq t1,t2, 4
30 : 두칸 아래이니 L1 = 2 * 4 ->  beq t1,t2, 8

위와같은 과정으로 링크를 설정할 수 있다. 

## j와 beq 에서의 L을 통해 (BTA) 값 구하는 법

J : 26bit 이니 6개만 추가하면 된다.
1. 4의 배수이니 하위 2bit에 0을 추가해 주자
2. 나머지 4bit는 PC 에서 상위 4bit를 가져와서 쓰자

beq : 16bit 이니 16개만 추가하면 된다.
1. 4의 배수이니 하위 2bit에 0을 추가해 주자
2. 18bit와 PC 값을 더해서 bta를 구한다.



SLT

slt t1, t2, t3 - R # t2 < t3 -> t1 = 1
slti t1, t2 , num - I # t2 < num -> t1 = 1
sltu t1, t2, t3 - R # 기존에서 양수만 비교 -> 사인비트까지 비교에 사용