Self-Improvement

** MIPS Instruction ** 본문

MIPS

** MIPS Instruction **

JoGeun 2020. 9. 10. 16:33

틀린점이 있다면 지적 바랍니다.

 

sw (store word)

ex) 
sw $zero, 0xC8+var_8($fp)
// var_8에 값 0을 저장

 

sh (store halfword)

ex) 
sh $t8, 0x70+var_32($sp) 
// var_32에 $t8의 값 2byte 할당 ex) socket의 port 부분

 

lw (load word)

ex)
lw $v0, 0xC8+arg_4($fp)
// $v0에 arg_4에 저장된 값 4byte를 저장

 

slti, sltiu (set less than immediate, set less than immediate unsigned)

ex)
sltiu $v0, 9
// $v0의 값이 9보다 작으면 $v0=1 아니면 $v0=0

 

beqz (branch on equal zero)

ex)
beqz $v0, def_40420C
// $v0 = 0이면 def_40420C로 jmp

// if( $v0 == 0 ) go to def_40420C

 

bnez (branch on not eaqual zero)

ex)
bnez $v0, loc_4043AC
// $v0 = 0이 아니면 loc_4043AC로 jmp 

// if( $v0 != 0 ) go to loc_4043AC

 

bne (branch on not equal)

ex)
bne $v1, $v0, loc_404490
// $v1과 $v0이 같지 않으면 loc_404490로 jmp

// if( $v1 != $v0 ) go to loc_404490

 

sll (shift left logical)

ex)
sll $v1, $v0, 2
// $v0의 값을 왼쪽 쉬프트 연산 2번하여 $v1에 저장
// $v1 = $v0 *4, $v1 = $v0 << 2

 

srl (=sra, shift right logical)

ex)
srl $v1, $v0, 2
// $v0의 값을 오른쪽 쉬프트 연산 2번하여 $v1에 저장
// $v1 = $v0 * 1/4, $v1 = $v0 >> 2

 

la (load address)

ex)
la $v0, loc_470000
// $v0에 loc_470000 주소를 저장

 

sb (store byte)

ex)
sb $zero, 0xC8+var_A0($fp)
// 0의 값을 var_A0의 1바이트에 저장

 

lb (load byte)

ex)
lb $v0, 0x11($v0)
// $v0의 값에 + 0x11를 더한 값의 1바이트를 $v0에 저장 

 

 

li (load immediate)

ex)
li $gp, 0x98490
// $gp에 0x98490값을 저장

 

lui (load upper immediate)

ex)
lui $v0, 0x47
// $v0 값은 0x00470000

 

addu (add unsigned)

ex)
addu $gp, $t9
// $gp에 $gp + $t9의 값을 저장

 

addiu (add immediate unsigned)

ex)
addiu $v0, $v1, $v0
// $v0에 $v1 + $v0의 값을 저장

 

blez (Branch on Less Than or Equal to Zero)

ex)
blez $s4, loc_4030B4
// $s4가 0보다 같거나 작으면 분기

// if( $s4 <= 0 ) go to loc_4030B4

 

bltz (Branch on Less Than Zero)

= 0 보다 작을 경우 분기한다

// if( $v0 < 0 ) go to ~~

 

bgez (Branch on Greater Than or Equal to Zero)

= 0 보다 크거나 같을 경우 분기한다

// if( $v0 >= 0 ) go to ~~

 

bgtz (Branch on Greater Than Zero)

= 0 보다 크면 분기

// if( $v0 > 0 ) go to ~~

 

ldc1, sdc1

= 단순히 lw, sw와 동일하며 double형 값을 사용할때 이용된다.

 

SWR


ex) $a1 = 0x2D505452
swr     $a1, 0($t8)

$t8
[0]	[1]	[2]	[3]	[4]	[5]	....
2d	50	54	52
= $a1에 저장된 값을 $t8의 0번지 부터 저장하며 4byte씩 끊는다

swr     $a1, 2($t8)

[0]	[1]	[2]	[3]	[4]	[5]	....
 	 	2d	50

 

 

SWL


ex) $a1 = 0x2D505452
swl     $a1, 3($t8)

$t8
[0]	[1]	[2]	[3]	[4]	[5]	....
2d	50	54	52

swl     $a1, 2($t8)
$t8
[0]	[1]	[2]	[3]	[4]	[5]	....
50	54	52

 

 slt(sltu) (Set on Less Than)

slt $t8, $s0, $t8
= $s0이 $t8보다 작으면 $t8의 값은 1, 아닐 경우 0