View
반복문을 이용하기 위해서는 Lable을 쓰면 간단하게 해결되는것 같다.
Branch Instruction이 흐름을 제어하는 문장인데, 여기서 BL ( Branch Link ) 를 이용해서, 문장이 실행된 뒤, 조건에 맞으면 문장을 다시 실행시키는 방법으로 ( while문과 같은 원리 ) 해결해보았다.
일단 문제 해결을 위해서는 비교하는 명령어집합을 7번 실행하면 되니까, 레지스터 하나에 0을 넣고 한 번 실행할 때 마다 1씩 더해줘서 6이 되면 탈출하게 하면 된다.
값을 0으로 초기화하는 가장 단순하고 경제적인 방법은 XOR을 이용하는 방법이다. 같은 값을 XOR연산 시키면 무조건 0이 나오니깐.
이전에 작성한 코드들을 loop : 를 통해 레이블링 해줬다. C의 goto같은 느낌인 거 같다. 막 쓰면 안좋겠지만, 루프를 만들려면 이렇게 하는게 맞는거 같다.
문장을 다 실행한 다음에는, 0으로 초기화해준 R5에 1씩 더해가고, CMP R5, #6 코드로 값을 비교한다. 만약 같지 않다면 ( Not Equal ) BLNE ( Branch Link Not Equal, 같지 않을때 해당 링크로 이동 ) 문장에 의해 loop로 레이블링 된 문장들을 다시 실행한다.
이렇게 반복문을 구현해봤다.
위 코드에서는 같은 부분만 참조하고 비교하고를 반복하고 있으므로, 주소값 증가에 대한 코드 작성이 필요하겠다.
주소값을 초기화하는 문장은 반복문 밖으로 꺼내고, 주소를 더하는 명령어는 STR 명령어에 추가로 붙여주는 방법으로 해결하였다.
이제 문제는, Bubble Sort 알고리즘을 해결하기 위해서는 배열의 원소 수만큼 loop를 실행시켜줘야하고, 배열이 4개니까 큰 루프를 4번 더 반복해줘야한다.
디버깅을 하던 중, 자꾸 안되는 이유를 찾았다. 코드를 저런 시식으로 짜놓으면, Swap이 이루어질 때만 주소가 앞으로 이동하더라.
이렇게 해줘야 정상적으로 작동한다.
아래는 3중첩 루프문으로 작성한 코드. 8개의 원소를 가진 4개의 배열을 Bubble Sort하는 어셈블리 코드이다.
아래는 첫 번째 배열의 원소를 다 정렬하고 ( 8개 ) 두 번째 배열의 원소를 정렬하는 중의 모습이다.
성공적으로 작동한다. 야호!
마지막으로 필요한 것은, Output_Data에 메모리에 저장되어있는 값들을 출력하는 것이다.
다음 포스팅에 이어 작성하겠슴당!
이라고 생각했는데, 과제를 유심히 살펴보니 단순하게 위에 메모리 덤프를 보여주기만 하면 되는거였네요 ㅋㅋㅋㅋ
역시 자체수정코드로 소스코드를 수정한다던가 그런 어려운 일은 시키지 않으셨어... 후
+ 과제를 잘못봤어요! 32개 숫자를 다 정렬하는거 더라구요? 데헷 ㅋㅋㅋㅋㅋ
결과적으로는 다음과 같은 코드가 되었습니당. ㅜㅜㅜ
정렬한 정수의 모습!
'학부생 CS > 컴퓨터 시스템 설계' 카테고리의 다른 글
Computer System Design - 4 : Memory Map (3) | 2019.04.06 |
---|---|
Computer System Design - 3 : Assembly instruction (0) | 2019.03.28 |
ARM assembly 로 정수 정렬하기 (2) -비교조건과 스왑 (0) | 2019.03.23 |
ARM assembly 로 정수 정렬하기 (1) - LDR, STR (1) | 2019.03.23 |
Computer System Design - 2 : arm & simple instruction (1) | 2019.03.14 |