ARM asm 의구조 ARM Assembly 실습 1. 기본골격 AREA armex,code, READONLY ;Mark first instruction to execute start MOV r0, #10 MOV r1,#3 ADD r0, r0, r1 ; r0 = r0 + r1 stop NOP NOP B stop ; Mark end of file 위의 asm의구조를이해하고실행해보세요. - AREA Directive -Section name, CODE, READONLY - Directive - Directive - LABEL 2. Calling Subroutine - BL destination AREA armex,code, READONLY ;Mark first instruction to execute start MOV r0, #10 MOV r1,#3 BL doadd ; Call subroutine ADD r0, r0, r1 ; r0 = r0 + r1 stop NOP
NOP B stop doadd ADD r0, r0, r1 MOV pc,lr ; Return from subroutine ; Mark end of file subroutine 을 call 하는예제를보인것입니다. 구조를이해하고타이핑해보세요. 3. Constant AREA TEST, CODE, READONLY loop r0, #0x10 r1, #10 b loop 레지스터에상수값을입력하는방법입니다. 각레지스터에어떤값이들어가는지확인해보세요
4. Conditional Execution 4.1 s 혹은 S suffix Data processing instruction 에 s suffix를붙이게되면 CPSR의 ALU status flag를 update하게됩니다. s suffix를붙이지않으면 ( 마찬가지로 ) update 는되지않습니다. 다음예제에서두가지를모두실행해보고 CPSR의 flag(nzcv) 가어떻게바뀌는지확인하고이유를설명하세요. - add r0,r0,r1 를실행 - adds r0,r0,r1 를실행 r0,#0xff000000 r1,#0x01000000 add r0,r0,r1 혹은 adds r0,r0,r1 Data processing instruction 중 CMP,CMN,TST,TEQ에대해서는 s suffix를쓰지마십시오. 이들은항상 flag들을 update시킵니다. 4.2 Execution conditions 다음은 ARM명령에붙을수있는 Conditional suffix의 16가지종류입니다. 각 suffix는 flag들을참조하여명령어를실행할지를결정합니다. 어떤 flag들을참조하는지맨아래표 에서보고빈칸을채우세요. 0 EQ equal 1 NE not equal 2 CS unsigned higher or same 3 CC unsigned lower 4 MI negative 5 PL positive or zero 6 VS overflow 7 VC no overflow 8 HI unsigned higher 9 LS unsigned lower or same 10 GE greater or equal 11 LT less than 12 GT greater than 13 LE less than or equal 14 AL 15 NV
0 Z Set 8 C Set and Z Clear 1 Z Clear 9 C Clear or Z Set 2 C set 10 N Set and V Set or N Clear and V Clear 3 C Clear 11 N Set and V Clear or N Clear and V Set 4 N Set 12 Z Clear and ether N Set and V Set or N Clear and V Clear 5 M Clear 13 Z Set or N Set and V Clear or N Clear and V Set 6 V Set 14 Always 7 V Clear 15 Never 4.3 Example of the use of conditional execution 다음은 arm의 conditional execution 의예를보인것입니다. C로표현되는것을 ARM ASM으로구현했을경우다음과같이됩니다. (1) 과 (2) 에알맞을 suffix를넣으세요. int gcd(int a, int b) { while(a!= b) { if(a>b) a = a b; else b = b a; } return a; } gcd less stop CMP B(1) B(2) SUB B SUB B r0,r1 stop less r0,r0,r1 gcd r1,r1,r0 gcd
nop nop B stop end 5.Loading constant into registers 명령어는 constant를 loading하는데값의범위에제한이있습니다. 다음코드를컴파일해보십시오. r0,#0x000000ff r0,#0x0000ff00 r0,#0x00ff0000 r0,#0xff000000 r0,#0xffffff00 r0,#0xffff00ff r0,#0xff00ffff r0,#0x000001ff r0,#0x11223344 - 에러의이유를설명하세요. - r0,#0xffff00ff가에러나지않는이유를설명하세요 다음코드를실행해보세요. 그리고 Disassembly를통해 r0에 0x11223344가들어가게되는메커니즘을설명하세요. AREA TEST, CODE, READONLY r0,=0x11223344 loop B loop space는위에쓰인숫자 (Byte) 만큼의 0으로채워진공백을만들어냅니다. 실행해보세요.
loop test AREA TEST, CODE, READONLY r0,=0x11223344 B loop SPACE 4200 - 만약에러가난다면그이유를설명해보세요 - LTORG Directive를 test label위에삽입하고서컴파일해보세요. 그리고 Disassembly를통해코드를확인하세요. DCD directive는현재위치에 1개혹은그이상갯수의 word를메모리에저장하는데쓰입니다. AREA TEST, CODE, READONLY r0,=data32bit r1,data32bit loop B loop Data32bit DCD 0x11223344 이두군데쓰였는데차이점을확인하세요.
Memory access instructions 1. 32Bit 혹은 8Bit Unsigned word load/store 1.1 op{cond}{b}{t} Rd,[Rn] r0,=0x8000 r1,[r0] b r2,[r0] neb r3,[r0] str r0,#0x8100 r2,#0x3400 r2,[r0] 1.2 op{cond}{b}{t} Rd, [Rn, FlexOffset]{!} 1) FlexOffset1: #expr(-4095~4095) r0,=0x8000 r2,[r0,#4095] r2,[r0,#-4095] b r2,[r0,#0x4] str r2,[r0,#0x100] FlexOffset이상수로온경우이다. 2) FlexOffset2: {-}Rm{,shift} r0,=0x8000 r1,=0x5000 r2,[r0,r1] FlexOffset이레지스터로올수있다. r1,=0x10 r2,[r0,-r1] FlexOffset이 레지스터의형식으로올수도있다.
r1,#-8 r2,[r0, r1, ASR #1] ;ASR 1<=n<=32 r3,[r0,#-4] FlexOffset이레지스터와 Shift 의값으로올수있다. 2,3번째명령어를비교하시 오. ASR은 Arithmetic Shift Right로서최상위비트가카피되면서 Shift가일어난다. r1,#4 ;#expr -4095<= expr <=4095 r2,[r0,r1,lsl #1]! r3,[r0,r1,lsr #1]! ;LSR 1<=n<=32! 의용법을익히자. -r0의값이어떻게변하는지살펴보시오. 1.3 op{cond}{b}{t} Rd, label r0,looptest r1,=looptest looptest b looptest r0와 r1에들어간값의차이를설명하시오 1.4 op{cond}{b}{t} Rd, [Rn], FlexOffset r0,=0x8000 r2,[r0] r2,[r0],#0x08 ;#expr -4095<= expr <=4095 r2,[r0] r2,[r0,#0x08]! r2에들어가는값과 r0값의추이를살펴보시오 r0,=0x8000 r1,#0x04 r2,[r0],r1,lsl #1 ;LSL 0<= n <=31 FlexOffset의용법은위의예제와같다. r2와 r0의값의추이를살펴보시오.
2. Load Signed 8Bit, Singed and Unsigned 16Bit halfword / Store 16Bit halfword 2.1.op{cond}type type: SH/H/SB Rd, [Rn] r0,#0 add r0,r0,r0 ;reset carry str r1,=0x8100 r2,=-1234 r2,[r1] sh r2,[r1] h r2,[r1] sb r2,[r1] eqsh r2,[r1] eqsb r2,[r1] sh 는 signed halfword이며 h는 unsigned halfword이다. 또한 conditional field의위치도유의하시오. 3.LDM and STM op{cond}mode Rn{!}, reglist{^} ldmia r8,{r0,r2,r9} stmdb r1!,{r3-r6,r11,r12} stmfd sp!,{r0,r4-r7,lr} ldmfd sp!,{r0,r4-r7,pc} 위의 Multiple Load/Store명령어의동작을그림을그려설명하시오.
General data processing instructions ADD,SUB,RSB,ADC,SBC, and RSC AND, ORR, EOR, and BIC MOV and MVN CMP and CMN r0,#1 r1,#2 cmp r0,r1 r0,#2 r1,#1 cmp r0,r1 r0,#1 r1,#1 cmp r0,r1 TST and TEQ TST: Bitwise AND str r1,=0x8100 r2,=0x10 r2,[r1] r2,[r1]
r3,=0x10 ; 4th bit ; r3,=0x20 ; 5th bit tst r2,r3 beq zero28th bne nonzero28th zero28th nop nop nonzero28th nop nop tst는특정비트가세트되어있는지확인하는용도이다. 위의예에서는 r2의 4번비트 ( 혹은 5번비트 ) 가세트되어있는지확인하는프로그램이다.