다음은 4x4행렬의 곱셈을 Assembly 로 구현한 부분입니다.
[Assembly Code]
main NOP MOVS r9, #4 //r9는 count 하기위해 4를 저장합니다. MOV r10, #0x80 //r10은 0x80번지 memory에 store하기위해 해당번지(0x80)로 설정해둡니다.
//r1은 ARRAY1, r2는 ARRAY2의 주소를 가리키고, r3, r4에 각각 1, 2의 값이 저장되게 합니다. LDR r1, =ARRAY1 LDR r2, =ARRAY2 LDRB r3, [r1], #1 LDRB r4, [r2], #1 LOOP1 CMP r9, #1 MOVS r0, #4 //r0은 LOOP2에서 각 4번씩 count하기위해 4를 저장합니다. BL LOOP2 LDR r2, =ARRAY2 //r2는 LOOP2를 돌면, 값이 변하므로, 다시 ARRAY2를 가리키게합니다. LDRB r4, [r2], #1 LDRB r3, [r1], #1 //r1의 값을 ARRAY1의 0x1에서 0x2로 load합니다. SUBS r9, r9, #1 //r9의 count값을 1 빼줍니다. BNE LOOP1 EXIT B EXIT LOOP2 CMP r0, #1 //r0이 LOOP2를 4번 수행하도록 비교합니다. MOVS r5, #0 //r5,r6은 아래 STMIA를 거치면 값이변하므로, 초기화합니다. MOVS r6, #0 SMLAL r5, r6, r3, r4 //r3,r4의 값을 곱한후, r5,r6에 더하여줍니다. STMIA r10!, {r5,r6} //r5,r6의 값을 memory r10번지(0x80)에 store시킵니다. LDRB r4, [r2], #1 //r2의 값을 바꿔가며, r3과 r4를 곱해줍니다. SUBS r0, r0, #1 //r0의 카운트를 1 줄여줍니다. BNE LOOP2 MOV pc, r14 DATA ARRAY1 DCB 0x1, 0x2, 0x3, 0x4 ARRAY2 DCB 0x2, 0x3, 0x4, 0x5 END |
다음은 IAR Embedded Workbench 툴에서 Assembly 코드로 직접 돌려본 후 분석하는 부분입니다.
보드를 선택하는 부분에서 ARM 계열의 Cortex-m3라는 보드를 선택하였습니다.
1. 처음 돌렸을때의 화면입니다. 아래 memory영역을 보면 ARRAY1, ARRAY2의 값이 memory 해당주소에 저장되있음을 확인할 수 있습니다.
2. 오른쪽 register창 에서, R1,R2의 값을 주소를 저장하고, R3,R4에는 각각 ARRAY1, ARRAY2의 값이 들어감을 확인할 수 있습니다. 또한 r9에는 count하기위한 값 ‘4’가, r10에는 0x80번지가 저장됩니다.
3. LOOP2 내 에서 한번 수행했을 때입니다. r0는 1줄었고, R3은 1이고, R4는 2를 수행하고 난 뒤인 3의 값을 가진 모습입니다. R5에는 R3(1) X R4(2)일때의 값인 2를 저장하고 있습니다. R10은 8만큼 증가한 값을 가집니다.
4. LOOP1를 두 번째 돌기 직전의 화면으로, R0은 다시 4로 초기화되어있고, R3의 값은 1일 때 R4(2,3,4,5)를 4번 곱한 후, 증가한 2의 값이 되어있습니다. R9는 LOOP1를 1번 돌았으므로 1만큼 감소한 3을 나타냅니다.
5. 아래 메모리를 확인하면, 0x80번지 메모리부터 차례로 R3XR4를 한 값들이 저장되어있음을 확인할 수 있습니다. LOOP1을 3번 수행했을 때입니다.
1x2=2, 1x3=3, 1x4=4, 1x5=5 // 2x2=4, 2x3=6, 2x4=8, 2x5=A // 3x2=6, 3x3=9, 3x4=C, 3x5=F
6. 종료되었을때의 화면입니다. R0=0, R9=0으로 전부 카운트되었음을 확인할 수 있고, 아래 메모리에서도 값들이 전부 저장되었음을 확인할 수 있습니다.
'ETC > Microprocessor' 카테고리의 다른 글
Assembly로 16진수 무작위 숫자에 대한 1 Carry (0) | 2016.05.03 |
---|---|
Assembly로 짝수/홀수의 갯수 세기 (0) | 2016.05.03 |
IAR Embedded Workbench를 이용한 Assembly 분석 (0) | 2016.05.03 |
WRITTEN BY