간단한 밉스 사용법
-컴파일시 code는 address ,code ,basic, source 등으로 나뉘게 된다.
-address는 메모리상 데이터를 의미한다. 4단위의 byte로 쪼개진다. 이는 주소가 word 단위이기 때문이다.
-code는 실제적으로 프로세서 이해하는 기계어이다. basic은 어셈블리어이다.
우리가 basic. 즉 어셈블리어를 작성할 때 보통 16진수 4비트를 입력한다.
하지만 레지스터가 인식하는 비트는 2의 32승. 이는 16진수인 2의4승으로 8자리수.
따라서 실질적으로 어셈블러가 인식하는 basic은 16진수 8자리가 된다.
-.data, .text를 통하여 내가지금부터 적을 값이 어떤 타입의 데이터가 되는지 알려준다.
-$v0 는 systemcall 로 약속이다.
Register type 의 arithmetic opreation (연산)
register type’s instruction format
-레지스터 지정은 레지스터가 32개임에 따라 5bit만 필요하다.
-shift amunt는 이동할때만 이용하고 덧셈뺄셈등을 할 때는 unused이다.
Add subtract multiply
2source and 1 destination
-mips
add $s0(destination), $s1(source), $s2(source)
sub $t0, $s1, $s2
mul $s4, $s1, $s2
--1개의 opcode + 3개의 operand로 이루어져있다.
ex)
.text
-register operation에서 사용되는 모든 연산자는 전부 메모리가 아닌 레지스터에 있어야한다.
(몇몇 프로세스중 메모리를 허용하는것도 있기는 하다.)
f=(g+h)-(i+j) 구성해보기
-mips
#f=(g+h)-(i+j)
#변수로 저장되는 값은 s 에 고정형으로 넣어주고
#변수로 저장하지 않아도 되는 값은 t에 넣어준다.
add $t0,$s1,$s2
add $t1,$s3,$s4
sub $s5,$t0,$s1
Immediate type arithmetic opreation
기본 구조 첫 번째 데이터 : source.. resister에 저장되어 있다.
두 번째 데이터 : immeidate value.. 는 명령이 그것 자신이다.
-mips
.text
#컴파일시 s0 에 -61이 들어간다.
addi $s0,$t0,-61
#컴파일시 s0에 0xffff가 들어간다.
addi $s0,$t0,0xffff
#컴파일시 s0에 0xffff 가 들어간다.
addiu $s0,$t0,0xffff
양수와 음수
보수관계 나타내기
1111001
이 있으면
signbit가 1이다.
그러면 쭉가다가 처음으로 sign bit가 1이 아닌부분이 나오게 되면
그앞에 1부터 써준다.
그앞의 1은 그냥 읽고 뒷부분은 빼준다.
1001에서 8-1=7//-7
11111010은
8-2=6//-6
11111111
1-0=1//-1
memory operation
load 와 store 가 같이 이루어져야한다.
load :lw
store:sw
.data
mytext: .asciiz "Hi! Students\n"
yourtext: .asciiz "Hi! professor. My name is Kim Soongsil."
.text
li $v0, 4 # $v0 : service #, 4 --> print string
la $a0, mytext # $a0 : argument
syscall
li $v0, 4 # $v0 : service #, 4 --> print string
la $a0, yourtext # $a0 : argument
syscall
addi 는 add immetidate를 의미한다.
li는 pseudo instruction으로 야매 명령어를 의미한다.
li $s0, 0 # s0 = 0
li $s1, 1 # s1 = 1.이때 실제 명령어는 addiu $17,$0,0x00000001
li $s2, 2 # s2 = 2
li $s3, 0x12345678 # s3 = 0x12345678 --> pseudo-inst.
#실제 코드는 lui $1,0x00005678를 통해어 $1. 즉 $at에 upper. 위에서부터 담아라.
즉 12340000로 담고나서 oring. or. 즉 0이아닌수가 우선으로 $19에 at에 있는 데이터와 뒷자리 네자리를 oring하면 원하는 숫자를 $19레지스트리 안에 담을 수 있게된다.
ori $19,$1,0x00005678
그리고 그냥
addiu $t1,$s1,0xffff 또는
addi $t1,$s1,0xffff 이것을 쓰게되면 둘다 결과는 0000ffff인다.
과정: 어차피 레지스터는 32비트를 받아야 하므로 00000000과 0000ffff를 oring 하여 명령을 수행한다.
#
실제 immediate 코드는 2의 16승 까지 사용가능 .이는 16진수 4자리밖에 이용하지 못한다
그래서 우리가 그냥 li를 사용하더라도 실제로는 0x1234가 upper
add $s0, $s1, $s2 # s0 = 1 + 2
add $s0, $s0, $s3 # s0 = 1 + 2 + 0x12345678
sub $s0, $s0, $s3 # s0 = s0 - s3
addi $t0, $s1, 3 # t0 = s1 + 3
addi $t1, $s2, -4 # t1 = s2 - 4
addi $t2, $s1, 0xffff # signed operation :: but means 0x0000ffff
addi $t3, $s1, 0xffffffff # signed operation :: means -1
addiu $t4, $s1, 0xffff # unsigned operation
addi $t2, $s3, 0x12345 # t2 = s3 - 0x12345 (larger than 16 bit) --> pseudo-inst.
addi $t3, $s3, 0x2345 # t3 = s3 - 0x2345 ( less than 16 bit ) --> basic inst.
밉스 추가 공부
.date —데이터를 입력하겠다.여기에서 데이터는 메모리에 저장도니다.
#mytext라는 뱐수에 아스키즈값 hi를 넣는다.
mytext: .asciiz “hi”
#li는 load instruction이다. 즉 vo레지스트리에 4를더하여 print string을 불러온다.
li $v0,4
#la 로 load address를 한다.
#a0에 mytext라는 주소값을 넣어준다.
la $a0,mytext
#호출한다.
syscall
lw-load word
'언어 > mips' 카테고리의 다른 글
| mips_example2 (0) | 2017.12.26 |
|---|---|
| mips_example1 (0) | 2017.12.26 |
| Branch_jump_jr_매크로&함수_for문_if문 (0) | 2017.12.26 |
| li_srl_sll_or_nor_zero_la_lw (0) | 2017.12.26 |