다음은 4x4행렬의 곱셈을 Assembly 로 구현한 부분입니다.


[Assembly Code]

main NOP

       MOVS r9, #4 //r9count 하기위해 4를 저장합니다.

       MOV r10, #0x80

//r100x80번지 memorystore하기위해 해당번지(0x80)로 설정해둡니다.

 

//r1ARRAY1, r2ARRAY2의 주소를 가리키고, 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 //r0LOOP2에서 각 4번씩 count하기위해 4를 저장합니다.

       BL LOOP2

       LDR r2, =ARRAY2 //r2LOOP2를 돌면, 값이 변하므로, 다시 ARRAY2를 가리키게합니다.

       LDRB r4, [r2], #1

       LDRB r3, [r1], #1 //r1의 값을 ARRAY10x1에서 0x2load합니다.

       SUBS r9, r9, #1 //r9count값을 1 빼줍니다.

       BNE LOOP1

EXIT B EXIT

LOOP2 CMP r0, #1 //r0LOOP24번 수행하도록 비교합니다.

       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의 값을 바꿔가며, r3r4를 곱해줍니다.

       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 내 에서 한번 수행했을 때입니다. r01줄었고, R31이고, R42를 수행하고 난 뒤인 3의 값을 가진 모습입니다. R5에는 R3(1) X R4(2)일때의 값인 2를 저장하고 있습니다. R108만큼 증가한 값을 가집니다.


4. LOOP1를 두 번째 돌기 직전의 화면으로, R0은 다시 4로 초기화되어있고R3의 값은 1일 때 R4(2,3,4,5)4번 곱한 후, 증가한 2의 값이 되어있습니다R9LOOP11번 돌았으므로 1만큼 감소한 3을 나타냅니다.


5. 아래 메모리를 확인하면, 0x80번지 메모리부터 차례로 R3XR4를 한 값들이 저장되어있음을 확인할 수 있습니다. LOOP13번 수행했을 때입니다.

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으로 전부 카운트되었음을 확인할 수 있고아래 메모리에서도 값들이 전부 저장되었음을 확인할 수 있습니다.


WRITTEN BY
SiriusJ

,