티스토리 뷰
개요
RISC - V 의 ARM 프로세서의 어셈블리 언어를 보고 싶다면 시뮬레이터를 이용하면 됩니다. 사용하기 전에 기초지식과 RARS, VENUS 시뮬레이터에 대해 간단하게 훑고, 시뮬레이션 방법을 설명해드리겠습니다. 또한 간단하게 예제코드를 통해 C언어가 어셈블리 언어(RISC-V ARM)으로 변경되는 결과를 보여드리겠습니다.
GUI-based RISC-V 시뮬레이터는 RARS, VENUS가 있다. 본 글에서는 RARS를 사용합니다.
RARS : https://github.com/TheThirdOne/rars
VENUS : https://venus.cs61c.org
RARS의 장점
- RV64I Instructions 을 지원하여 내가 짠 코드에서 사용한 ld, sd 등을 인식이 가능하다.
- 수도 명령어를 기계어로 변환한 것을 단계별로 비교할 수 있다.
- 깃허브에 최신버전이 꾸준히 업데이트 된다.
RARS 단점
- JDK를 설치해야한다.
- VS Code Extension을 지원하지 않는다.
VENUS의 장점
- VS Code Extension 지원
- web interface 지원
VENUS의 단점
- RV64I 명령어를 지원하지 않고, RV32IM 명령어만 지원한다.
- 2017년이후로 지속적인 업데이트가 되지않는다.
RARS 선택 이유
비너스는 RV64I 명령어를 지원하지 않으므로 64bit regiter도 다룰 수 없다. 내가 짠 코드는 64bit 프로세서 기준이므로 RARS를 이용한다.
RARS 사용 과정
- JDK를 설치한다.
- RARS 1.6 Java executable file을 설치한다. (설치 : https://github.com/TheThirdOne/rars)
- java -jar ‘경로\rars1_6.jar’ 을 powershell에서 타이핑한다.
- File-New
- test code를 입력
- assemble the current file and clear breakpoints 클릭
- Address 부분은 4byte 의 길이를 가진 것을 확인 할 수 있다.
- code의 4byte는 32bit의 길이를 가진 machine code이다.
- Setting > 64bit check : ld와 sd를 사용하기 위하여 설정 체크
간단한 예제코드로 시뮬레이션
C언어 코드
어셈블리 언어를 단순성을 위하여 A[10]= {1,-1,1,-1,1,-1,1,-1,1,-1} 로 하자
assembly 코드
레이블 | Assembly 언어 | 주석 |
---|---|---|
addi x5, x0, 1 | A[10] = {1,-1,1,-1,1,-1,1,-1,1,-1} 를 변수 선언하기 위하여 1과 -1을 x5, x6에 담음 | |
addi x6, x0, -1 | ||
addi x2, x2, -80 | 80byte (10개*8byte) 저장하기 위한 stack pointer 조정 | |
sd x5, 0(x2) | ||
sd x6, 8(x2) | ||
sd x5, 16(x2) | ||
sd x6, 24(x2) | ||
sd x5, 32(x2) | ||
sd x6, 40(x2) | ||
sd x5, 48(x2) | ||
sd x6, 56(x2) | ||
sd x5, 64(x2) | ||
sd x6, 72(x2) | ||
add x25, x0, x2 | x25에 x2의 값을 저장한다. x2는 스택포인터 의미 | |
add x24, x0, x0 | sum = 0 | |
add x22, x0, x0 | i = 0 | |
addi x5, x0, 10 | x5 : = 10 | |
LOOP: | bge x22, x5 EXIT | i>10 이면 EXIT로 분기 |
slli x6, x22, 3 | x5 : = i*8 | |
add x6, x6, x25 | x5 : = &A + i*8 | |
ld x6,0(x6) | x6 : =&A[i] | |
bge x0, x6, IF_N | A[i]≤0이면 IF_N으로 이동 | |
add x24, x24, x6 | A[i]>0일 경우 sum = sum+A[i] | |
IF_N: | addi x22, x22, 1 | i=i+1 |
beq x0, x0, LOOP | ||
EXIT: |
시뮬레이션 결과
'짤막한 지식' 카테고리의 다른 글
크로스컴파일 및 어셈블리언어 분석 (2) | 2023.05.01 |
---|---|
[JS][TIL] JS의 내장함수(fill) (2) | 2023.01.18 |
[JS][TIL] 개행문자 없이 로그출력 (process.stdout.write()) (0) | 2023.01.15 |
[Python][TIL] 파이썬의 문자열은 string[n] = '*' 로 수정할 수 없다. (0) | 2022.09.18 |
[Github] 기본 사용법 및 Git&Linux 명령어 (0) | 2022.07.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 성능 측정
- 이미지최적화
- 부트캠프
- 사이드프로젝트
- Not Working
- 패스트캠퍼스
- Tailwind CSS
- JavaScript
- 로딩성능
- Vercel
- FE
- ci/cd
- 개발자 회고
- 프론트엔드개발자
- 국비지원
- Github Actions
- FE 주니어
- no found
- 국비지원취업
- 모노레포
- 성능 개선
- kpt
- 인프콘 2023
- 깃허브 사용법
- 깃허브
- RARS
- 리뷰
- netlify
- 프론트엔드 성능
- next 14
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함