다음은 16진수의 무작위 숫자에 대하여 짝수인지, 홀수인지를 파악하는 Assembly code입니다.


main NOP

       NUM EQU 10

       LDR r1, =RANNUM //r1RANNUM의 주소를 Load합니다.

       MOV r6, #NUM //r6은 총 10개의 숫자들의 개수를 가리킵니다.

       LDRB r5, [r1] //r5r1의 값을 저장합니다.

       MOV r2, #0 //r2는 홀수를 세는 count, 0으로 초기화합니다.

       MOV r3, #0 //r3는 짝수를 세는 count, 0으로 초기화합니다.

       LDRB r5, [r1], #1 //r5가 다음 r1을 가리키도록 합니다.

LOOP MOV r0, r5, LSL #31 

/* r5의 값을 31bit만큼 shift left하여 맨 뒤의 bit값만 저장합니다. 홀수라면 0x10000000이될것이고, 짝수라면 0x00000000일것입니다. */

       MOV r7, r0, LSR #31 

//다시 r7의 값을 31bit만큼 right shift시키면, 0x00000001(홀수), 0x00000000(짝수) 가 됩니다.

       CMP r7, #1 //이제, r7을 비교합니다.

       ITE EQ

       ADDEQ r2, r2, #1 //만약 같다면, 홀수의 카운트를 늘려주고, 다르다면 짝수의 카운트를 늘려줍니다.

       ADDNE r3, r3, #1

       LDRB r5, [r1], #1 //r5가 다음 r1값을 가리키도록 설정합니다.

       SUBS r6, r6, #1 //한번 수행할때마다 Num의 값을 1씩 줄여줍니다.

       BNE LOOP

EXIT B EXIT

       DATA

RANNUM DCB 0x10, 0x3, 0x23, 0x20, 0x43, 0x7, 0x21, 0x56, 0x67, 0x36

//임의의 무작위 수들 10가지 (0x10, 0x3, 0x23, 0x20, 0x43, 0x7, 0x21, 0x56, 0x67, 0x36)

       END 



다음은 IAR Embedded Workbench 툴에서 Assembly 코드로 직접 돌려본 후 분석하는 부분입니다.

보드를 선택하는 부분에서 ARM 계열의 Cortex-m3라는 보드를 선택하였습니다.


1. 초기화면입니다.


 2. R1에는 RANNUM의 주소값이, R6에는 총 NUM갯수인 10의 값(A), R2,R3는 각각 0으로 초기화된 화면입니다.


 3. 처음 R531bit만큼 shift해주어 r0에 저장하고, 다시 31bit만큼 shift해주면 0x00000000이 됩니다. 0x10은 짝수이기 때문에 0x00000000으로 되어, 0의 값이 R7에 저장됩니다. 다음으로 CMP를 이용하여 r71을 비교합니다.


 4. 0x10은 짝수이므로, R31을 더하여줍니다.


 5. 한번 시행되었을 때마다, R6에서 1씩 횟수(count)를 줄여줍니다.


6. 홀수일때의 모습입니다. R0에는 shift left된 모습이 저장되어있고, R2count되어 1더하여진 모습을 확인할 수 있습니다.


 7. 종료되었을 때의 화면으로, 총 홀수가 6, 짝수가 4개 있음을 확인할 수 있습니다.


WRITTEN BY
SiriusJ

,