간단한 밉스 사용법

-컴파일시 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

+ Recent posts