스터디

C 코드 - swap void swap(int v[], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } v : $a0 k : $a1 temp : $t0 MIPS 코드 swap: sll $t1, $a1, 2 # $t1 = k * 4 add $t1, $a0, $t1 # $t1 = v + (k * 4) = &v[k] lw $t0, 0($t1) # temp = v[k] lw $t2, 4($t1) # $t2 = v[k+1] sw $t2, 0($t1) # v[k]= $t2 sw $t0, 4($t1) # v[k+1] = temp jr $ra C 코드 - sort void sort (int v[], int n) { int i, j; for (i = 0;..
동기화(Synchronization) 메모리 영역을 공유하는 두 프로세서 P1이 쓴 다음 P2가 읽는다. P1과 P2가 동기화되지 않으면 데이터 경합이 발생한다. 액세스 순서에 따라 결과가 달라진다. 하드웨어 지원 필요 읽기/쓰기 메모리 Atomic operation 읽기와 쓰기 사이에는 해당 위치에 대한 다른 접근이 허용되지 않는다. 단일 명령일 수 있다. 예: 레지스터 ↔ 메모리의 atomic swap Or 명령의 atomic 쌍 MIPS의 동기화 Load linked ll rt, offset(rs) Store conditional sc rt, offset(rs) ll 이후 위치가 변경되지 않으면 성공 rt = 1 위치가 변경되면 실패 rt = 0 예: atomic swap (to test/set l..
1. Immediate addressing 필요한 데이터를 직접 넣는다. I-포맷 명령 op rs rt constant or address 6비트 5비트 5비트 16비트 명령어 : addi 2. Register Addressing 피연산자로 레지스터 주소를 사용한다. R-포맷 명령 op rd rs rt shamt funct 6비트 5비트 5비트 5비트 5비트 6비트 명령어 : add, sub 3. Base addressing 피연산자인 레지스터 주소와 address(상수값)의 합으로 메모리에 접근한다. I-포맷 명령 op rs rt constant or address 6비트 5비트 5비트 16비트 명령어 : lw, sw 4. PC-relative addressing Branch target address..
32비트 상수 32비트 상수의 경우 16비트 두개로 쪼개서 저장한다. lhi rt, constant 16비트 상수를 rt의 상위 16비트에 복사하고 rt의 하위 16비트를 0으로 비운다. 이후 rt의 하위 16비트를 넣는다. lhi $s0, 61 # 0000 0000 0111 1101 0000 0000 0000 0000 ori $s0, $s0, 2304 # 0000 0000 0111 1101 0000 1001 0000 0000 분기 주소지정(Branch Addressing) 분기 명령어 Opcode, 레지스터 2개, 대상 주소 대부분의 분기 대상은 분기 근처에 있다. I-포맷 op rs rt constant or address 6비트 5비트 5비트 16비트 PC 상대 주소 지정 대상 주소 = PC(프로그..
Byte(1Byte)/Halfword(2Byte) 연산자 비트 연산을 사용할 수 있다. Sign lb rt, offset(rs) # rs 메모리 주소에서 1바이트만큼 rt 레지스터에 저장 lh rt, offset(rs) # rs 메모리 주소에서 2바이트만큼 rt 레지스터에 저장 Unsigned 0으로 확장 lbu rt, offset(rs) lhu rt, offset(rs) Store sb rt, offset(rs) sh rt, offset(rs) 문자열 복사 예제 문자열을 1바이트 씩 복사해서 옮기기 C 코드 Null로 끝나는 문자열 널 스트링(\0)을 만날때까지 계속 배열 인덱스를 증가시키면서 복사하는 코드 다른 함수를 호출하지 않는다. → Leaf 프로시저 → 스택에다가 $s 레지스터를 저장한다. v..
프로시저 호출 단계 레지스터에 매개변수 배치 제어권을 프로시저에게 줌 프로시저(callee)를 위한 저장공간 확보 프로시저의 작업 수행 caller를 위한 레지스터 결과 배치 호출 장소로 돌아가기 레지스터 $v0~1 결과값 64비트일수도 있기때문에 2개 존재 (레지스터 2~3) $a0~3 아규먼트 (레지스터 4~7) $t0~9 임시값 callee가 덮어쓸수 있다. (레지스터 8~15) $s0~7 saved callee에 의해 저장/복원 (레지스터 16~23) $gp 정적 데이터를 위한 글로벌 포인터 (레지스터 28) $sp 스택 포인터 (레지스터 29) $fp 프레임 포인터 (레지스터 30) $ra 리턴 주소 (레지스터 31) 프로시저 호출 명령어 프로시저 호출: jump & link jal Proced..
조건부 연산자 조건이 참인 경우 레이블이 지정된 명령어로 분기 그렇지 않은 경우 순차적으로 계속 진행 beq rs, rt, L1 if (rs == rt)이면 L1으로 분기 bne rs, rt, L1 if (rs != rt)이면 L1으로 분기 j L1 L1으로 무조건 점프 If 문 C 코드 if (i==j) f = g+h; else f = g-h; f : $s0 g : $s1 h : $s2 i :$s3 j : $s4 MIPS 코드 bne $s3, $s4, Else add $s0, $s1, $s2 j Exit Else: sub $s0, $s1, $s2 Exit: ... While 문 C 코드 while (save[i] == k) i += 1; i : $s3 k : $s5 save 주소 : $s6 MIPS 코..
논리 연산자 연산자 C MIPS Shift Left srl Bitwise AND & and, andi Bitwise OR | or, ori Bitwise NOT ~ nor Shift 연산자 R-포맷 op rs rt rd shamt funct 6비트 5비트 5비트 5비트 5비트 6비트 shamt : 얼마나 많은 위치를 이동할지 Shift left logical (sll) 왼쪽으로 시프트하고 0비트로 채운다. i만큼 sll하면 2^i 만큼 곱한다. Shift right logical (srl) 오른쪽으로 시프트하고 0비트로 채운다,. i만큼 srl하면 2^i 만큼 나눈다. (unsigned 일때만) AND 연산자 단어의 비트를 마스크하는 데 유용 일부 비트를 선택하고 다른 비트를 0으로 지운다. 둘다 1일때..
명령어 표현 명령어는 2진수로 인코딩 = 기계어 MIPS 명령어 32비트 명령어로 인코딩 연산 코드(opcode)를 인코딩하는 형식의 작은 수, 레지스터 번호 등 규칙성 레지스터 번호 $t0 – $t7 : 레지스터 8 – 15 $t8 – $t9 : 레지스터 24 – 25 $s0 – $s7 : 레지스터 16 – 23 레지스터를 표현하는데 5비트 필요 32 = 2^5이기 때문이다. MIPS R-포맷 명령어(add, sub) Register 포맷 op rs rt rd shamt funct 6비트 5비트 5비트 5비트 5비트 6비트 op : 연산 코드(opcode) rs : 첫 번째 소스 레지스터 번호 rt : 두 번째 소스 레지스터 번호 rd : 대상 레지스터 번호 shamt : shift amount (현재..
부호 없는(Unsigned) 정수 n비트 숫자 x = x_(n-1)2^(n-1) + x_(n-2)2^(n-2) + ... + x_0 2^0 범위: 0 ~ +2^n - 1 예제 0000 0000 0000 0000 0000 0000 0000 1011_2 = 11_10 32 bits 비트 사용 0 ~ +4,294,967,295 부호 있는(Signed) 정수 n비트 숫자가 주어지면 x = -x_(n-1)2^(n-1) + x_(n-2)2^(n-2) + ... + X_0 2^0 범위: -2^(n-1) ~ +2^(n-1)-1 예제 1111 1111 1111 1111 1111 1111 1111 1100_2 = -4_10 32 bits 비트 사용 -2,147,483,648 ~ +2,147,483,647 MSB : 부호 ..
파스텔코랄
'분류 전체보기' 카테고리의 글 목록 (3 Page)