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 # 기존에서 양수만 비교 -> 사인비트까지 비교에 사용