View
이번에는 ARM instruction들을 지원하는 ZedBoard위에서 값들을 정렬하는 방법을 공부해보려 한다.
일단 컴퓨터구조나 다른 기본적인 과목들을 수강하지 않은 상태에서 어셈블리어를 시도하려하니 굉장히 고난도라는 생각이 계속 들고있다.
명령어를 충분히 이해하지 못했거나, 또는 언어의 문법 자체가 굉장히 낯설기때문에
부적절하거나 최적화가 굉장히 의심되는 코드가 많이 등장할 예정이지만
뭐, 처음하는 사람의 애교 정도로 봐줬으면 좋겠다 ^^
확실히 맥북을 1년정도 쓰다가 부트캠프로 윈도우를 설치해 돌리니, 화질저하나 여러 불편한 점들을 많이 느끼고 있다...
포스팅하는데도 픽셀 자꾸 깨지고.. 캡쳐한 화면도 화질구지... ㅜㅜ
문제상황은 다음과 같다.
Input_data로 8개의 정수의 나열을 4묶음이 있다. 받은 데이터를 오름차순으로 정렬하여 Output_data에 출력하라.
이 상황에서 내가 선택할 수 있는 방법은 여러가지가 있겠지만, 가장 간단한 방법 두 가지가 있다고 생각되었다.
1. Bubble Sort등을 이용해 Input_data상에서 정렬을 마치고 Output_data에 첨부하기
2. 단순 비교하면서 Output_data에 작은 값부터 순서대로 넣기
이 둘중에서 실력향상을 위해서는 1번이 좀 더 도움이 될 것 같아서, Bubble Sort를 이용하는 방법을 설계해보려 한다.
일단, 코드에서 Input_data : .word 0,0,0,0,0,0,0,0 가 의미하는 바가 뭔지도 몰랐다.
문제상황이 정렬이니 word형 타입을 가진 배열일거라 생각하고 구글링을 열심히 했는데,
assembly array같은 검색어로 찾아봤을 때 계속 낯선 코드만 나왔다.
그러다가 위 문법이 Label 이라는걸 알게 되었다.
위처럼 데이터만 분류해놓을 수도 있고, 명령어도 포함할 수 있나보다. (Branch의 개념인가?)
저장된 수열에 접근하기 위해서, ARM에서 유일한 Memory 접근 Instruction인 LDR과 STR에 대해 찾아봤다.
LDR R0, =Memory Space : R0에 "Space의 주소값"을 저장
LDR R0, [R1] : R0에 "R1에 저장된 주소에 담긴 값"을 저장
STR R0, [R1] : R1의 주소에 "R0의 값"을 저장
LDR R0, [R1, #4] : R0에 R1에 저장된 주소 + 4 byte 에 담긴 값을 저장
LDR R0, [R1], #4 : R0에 R1에 저장된 주소에 담긴 값을 저장하고 R1에 담긴 주소 + 4 byte
LDR R0, [R1, #4]! : R0에 R1에 저장된 주소 + 4 byte에 담긴 값을 저장 후 R1에 담긴 주소 + 4 byte ( auto - update )
( STR에 대해서도 같은 확장을 제공함 )
STR 방향이 무지하게 헷갈린다. 왠지 디버그 찍는데 자꾸 실행없이 지나가는 것처럼 보이더라니만, 순서가 보통의 Instruction이랑 반대여서 그랬다.
예시를 자세하게 들며 설명하며 이해를 좀 해야겠다. 어려워요 교수님...
다음과 같은 Instruction을 작성했다고 가정하자.
코드를 첫번째 줄 까지 실행하면 레지스터와 메모리 상에서는 다음과 같은 상태가 된다.
다음 줄을 실행시키면, r0에 저장된 주소를 찾아가 그 값을 r1에 불러온다.
그 다음, 레지스터 R1에 4라는 값을 저장하고, R0이 가진 주소가 가리키는 위치에 R1의 값을 저장한다.
메모리에 다음과 같은 변화가 생긴다.
Bubble Sort를 구현하기 위해 다음과 같은 계획을 세웠다.
1. 2개의 레지스터에 주소를 하나씩 가져온다. ( 하나 구하고, add 4 byte 하면 될 듯 )
2. 두 주소 레지스터에서 주소에 저장된 값을 다른 두 레지스터에 가져온다.
3. 두 값을 비교하고, 앞의 값이 크면 Swap을 한다. 작거나 같다면 그냥 넘어가기.
3-1. 첫 번째 주소에 두 번째 값을 저장한다.
3-2. 두 번째 주소에 첫 번째 값을 저장한다.
3-3. 비교한 Flag 초기화해줘야함!
4. 두 주소 모두 + 4 byte씩 주소를 이동해준다.
이걸 7번 반복하면 한 줄 완성
이걸 4번 반복하면 문제 해결
구현에 대해서는 다음 포스팅에 이어 작성하겠습니당.
설명을 적다보니 생각보다 길어지네요.
'학부생 CS > 컴퓨터 시스템 설계' 카테고리의 다른 글
Computer System Design - 3 : Assembly instruction (0) | 2019.03.28 |
---|---|
ARM assembly 로 정수 정렬하기 (3) -반복문, Loop, Branch link (0) | 2019.03.23 |
ARM assembly 로 정수 정렬하기 (2) -비교조건과 스왑 (0) | 2019.03.23 |
Computer System Design - 2 : arm & simple instruction (1) | 2019.03.14 |
Computer System Design - 1 : 컴퓨터와 레지스터에 대해 간단히 (0) | 2019.03.12 |