컴퓨터구조

3. Data Transfer Instructions
  • H
Mar 16, 2023
  1. r-format
  2. i-format
  3. lw
  4. sw
  5. lb
  6. sb

4. Logical & Shift Instructions

Created by
  • H
    HM
Date
Mar 21, 2023

MIPS Logical Instructions

and, andi, or, ori, xor, nor, ….
bit-by-bit operation
→ 다른 자리에 의해서 영향받지 않는다
inverting 명령어를 굳이 가지고 있지 않아도 된다 → nor이용하면 됨

and, or, xor, nor

usages
and 한쪽이 1일 때는 그대로 / 한 쪽이 0일 때는 마스킹
2F만 남기고 모두 마스킹시키고 싶다면, 나머지를 모두 0으로 세팅하면 된다.
0xF234012F AND 0x000000FF = 0x0000002F
or combining bit fields
nor 특정 bit를 반전시키고 싶을 때
조건 → source 피연산자 중 하나가 0이어야 함
R-format
and (or, nor) rd, rs, rt

andi, ori

I-format instruction
andi (ori) rt, rs, imm

Sign-extension & zero-extension

가급적 sign-extension 을 취한다 (기본) → zero-extension은 예외적
기본이 sign-extension 이라는 것의 의미
: 어떤 value를 따질 때 2의 보수 체계로 해석하겠다
논리연산은 예외
논리연산에 한해서 zero-extension을 하기로 약속함

Shift

shift types

logical shift
arithmetic shift

shift directions

left → 2의 배수를 곱한다
right → 2의 배수를 나눈다
결과값이 정수가 아니면, **floor value (**작거나 같은 가장 큰 정수)를 취한다

Logical Shift

1.
Logical shift left
3.
Logical shift right
unsigned value를 다루는 것과 같은 효과를 가진다 (0으로 채우니까)

Arithmetic Shift

1.
Arithmetic shift right
MSB: 원래 가지고 있던 sign 값으로 채운다
LSB: 없어진다
(1100 >>> 3) = 1111
2.
Arithmetic shift left
그냥 0으로 채우면 된다

MIPS Shift Instructions

sll, srl, sra

R-Format
shift-amount 가 존재하니까
그러나 두 개의 레지스터와 shift-amount 를 표시한다
sll rd, rt, shamt // shift left logical
srl rd, rt, shamt // shift right logical
sra rd, rt, shamt // shift right arithmetic (sign-extension: MSB와 같은 값으로 extension한다 → 부호있는 수의 shift 연산에 사용됨)

sllv, srlv, srav

variable-shift instructions
상수만큼 shift 하는게 아닌 a 만큼 shift 하고싶을 때 사용
R-Format
sllv rd, rt, rs // shift left logical variable
srlv rd, rt, rs // shift right logical variable
srav rd, rt, rs // shift right arithmetic variable

shift operations

sll, srl
sll $rd, $rt, 4 // 4가 sa. $rt를 4만큼 shift해서 rd에 담는다
sllv, srlv
sllv $rd, $rt, $rs
sll srl 과 비슷하지만, shift amount가 $rs[4:0] 즉, 하위 다섯비트에서 온다
→ $rs가 가지고 있는 32bit 중 하위 5bit만큼 shift 한다는 의미
sra, srav
shift right arithmetic → sign-bit 를 확장한다
2의 보수 숫자를 나눌 때 유용

32비트 상수 load하기

1.
lw instruction 사용하기
2.
→ 좋지않은 방법 (상수가 메모리에 있다는 가정하에 쓰는 것이므로)
3.
lui, ori 명령어 사용하기

Pseudo Instructions

가짜 instruction. MIPS가 이해하지 못하는 명령어. 프로그래머나 컴파일러를 위해 만든 명령어
👍