1. GCD 구하기 소스코드
AREA |.text|, CODE, READONLY
EXPORT main
IMPORT |Lib$$Request$$armlib|, WEAK
IMPORT __main ; C library entry
IMPORT printf ; prints to stdou
main ; void main(void)
adr r5, data
ldr r1, [r5, #0]
ldr r2, [r5, #4]
ldr r3, [r5, #8]
MOVr4, r1
MOVr5, r2
BL loop
MOVr5, r3
BL loop
STMFDsp!, {r4}
ADR r0, print_string
BL printf
LDMFD sp!, {r4}
MOVR0, #0x18
LDRR1, =0x20026
SWI0x123456
loop
CMPr4, r5
SUBGTr4, r4, r5
SUBLTr5, r5, r4
BNE loop
MOVpc, lr
data
DCD 1234, 5678, 13572468
print_string
DCB "GCD of %d, %d, and %d is %d\n", 0
END
2. 소스코드 설명
DCD로 선언된 data를 r1, r2, r2로 각각 읽어온다.
ldr r1, [r5, #0]//r5는 DCD로 선언된 data의 address를 나타냄
ldr r2, [r5, #4]//r5+4byte
ldr r3, [r5, #8]//r5+8byte
구해 온 것을 r4와 r5에 r1, r2의 value를 MOV시킨다. 그리고 r4와 r5의 최대공약수를 구하는 loop에 넘긴다.
loop에서는 r4와 r5를 CMP로 비교하여 만약 r4가 크면 r4에 r4-r5를 한 결과값을 저장하고, r5가 크다면 r5에 r5-r4를 계산한 결과 값을 저장한다. 그리고 r4와 r5가 같지않다면 다시 loop를 돌고 같다면 다음명령어인 MOV pc, lr 즉, pc 레지스터에 이 전에 loop로 branch 하기 전에 main 함수내에서 lr레지스터에 저장한 pc값을 넣어 다음 명령이 main함수로 이어지게 한다.
그리고 r5에 r3를 MOV시키고 다시 loop 로 보내어 앞선 과정을 반복한다.
그리고 printf를 이용해 print_string에 DCB형태로 "GCD of %d, %d, and %d is %d\n"를 출력하게 한다.
'Studying!! > 공부를하자' 카테고리의 다른 글
Linux Scheduler 분석 (0) | 2008.11.17 |
---|---|
어셈블리 strcmp_length strcmp_byte 구현 (0) | 2008.10.17 |
Code Optimizing (0) | 2008.10.15 |
CPU 정보를 보여주는 모듈만들기 (0) | 2008.09.26 |
VI 명령어 모음 (0) | 2007.03.17 |