16진수의 무작위 숫자에 대하여 1이 몇개인지 숫자를 carry하도록 하는 Assembly 코드입니다.


[Assembly code]

main NOP

       MOV r4, #32 //r432(0x20)의 값을 저장합니다.

       LDR r1, RANNUM //r1RANNUM의 값을 LOAD합니다.

       MOV r0, r4 //r4의 값을 r0에 저장하여 r0에는 32의값이 들어갑니다.

       MOV r3, #0 //r30의 값으로 초기화합니다.

LOOP MOV r2, r1, LSR #31 

/* r1의 값(0x04882C2A)31bit만큼 LSR연산하여 r2에 그 값을 저장 합니다. 위 연산을 거치게되면 r20또는 1의 값이 저장됩니다. */

       CMP r2, #1 //r2의 값과 1을 비교하여, 만약 같다면 아래 ADDEQ로 분기하여 r3 1을 더하여 줍니다.

       IT EQ

       ADDEQ r3, r3, #1

       MOV r1, r1, LSL #1 //이제, r1LSL 1bit만큼 shift하여 저장합니다.

       SUBS r0, r0, #1 //r0에서 1의값을 뺍니다.

       BNE LOOP

EXIT B EXIT

       DATA

RANNUM DCD 0x04882C2A

       END



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

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


1. 초기화면입니다.


 

2. r1DATA RANNUMLOAD된 모습입니다.


3. r1을 왼쪽으로 shift 1bit만큼 해준 화면입니다.


 

4. r0의 값(32)에서 1만큼빼주어 31이 된 화면입니다.

 

5. r1의 값을 31bit만큼 오른쪽으로 shift해준 값을 r2에 저장합니다.


6. 만약, r2의 값이 1이라면, r3의 값에 1을 더해줍니다.


  7. 그리고 r1의 값을 다시 1bit만큼 왼쪽으로 shift해줍니다.


8. 이렇게 r0에 저장된 32번만큼 LOOP를 돌아서 r0의 값이 0이되면, exit됩니다.


WRITTEN BY
SiriusJ

,