본문 바로가기

Studying!!/공부를하자

어셈블리 GCD

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