2015년 1월 3일 토요일

ARM ASM 에서 ! (느낌표)의 의미와 동작의 이해


간혹 arm asm 에서 !느낌표를 사용하는 경우가 있는데 어떤 역할을 하는지 정리해 보았습니다.

ARM296EJ arm mode

______addr/line|code_____|label____|mnemonic________________|comment
    SR:00000000|E3A00D40____________mov_____r0,#0x1000_______;_r0,#4096
    SR:00000004|E3A01000            mov     r1,#0x0          ; r1,#0
    SR:00000008|E5B0100C            ldr     r1,[r0,#0x0C]!
    SR:0000000C|E3A00D40            mov     r0,#0x1000       ; r0,#4096
    SR:00000010|E3A01000            mov     r1,#0x0          ; r1,#0
    SR:00000014|E5901008            ldr     r1,[r0,#0x8]

시작전 레지스터 상태
N _  R0       1000  R8          0
Z _  R1         80  R9          0
C _  R2          0  R10         0
V _  R3          0  R11         0
Q _  R4          0  R12         0
     R5          0  R13         0
     R6          0  R14         0
     R7          0  PC          0
     SPSR       10  CPSR       D3

메모리 상태
________address|________0________4________8________C_0123456789ABCDEF
    SD:00001000|>00000000 00000000 00000080 00000090 ................
    SD:00001010| 00000000 00000000 00000000 00000000 ................
    SD:00001020| 00000000 00000000 00000000 00000000 ................

결과 1
______addr/line|code_____|label____|mnemonic________________|comment
    SR:00000000|E3A00D40            mov     r0,#0x1000       ; r0,#4096
    SR:00000004|E3A01000            mov     r1,#0x0          ; r1,#0
    SR:00000008|E5B0100C            ldr     r1,[r0,#0x0C]!
    SR:0000000C|E3A00D40____________mov_____r0,#0x1000_______;_r0,#4096

N _  R0       100C  R8          0
Z _  R1         90  R9          0

R0가 100C 가 됨

결과 2
______addr/line|code_____|label____|mnemonic________________|comment
    SR:0000000C|E3A00D40            mov     r0,#0x1000       ; r0,#4096
    SR:00000010|E3A01000            mov     r1,#0x0          ; r1,#0
    SR:00000014|E5901008            ldr     r1,[r0,#0x8]
    SR:00000018|00000000____________andeq___r0,r0,r0

N _  R0       1000  R8          0
Z _  R1         80  R9          0

R0가 1000 그대로 있음

결과 3
______addr/line|code_____|label____|mnemonic________________|comment
    SR:00000018|E3A00D40            mov     r0,#0x1000       ; r0,#4096
    SR:0000001C|E3A01000            mov     r1,#0x0          ; r1,#0
    SR:00000020|E490100C            ldr     r1,[r0],#0x0C
    SR:00000024|00000000____________andeq___r0,r0,r0

N _  R0       100C  R8          0
Z _  R1          0  R9          0

R0가 100C 가 되나 R1에는 0이 들어 있음


결론
ldr     r1,[r0,#0x0C]! 
C언어로 표현시 ; r1=*(r0+0x0C); r0=r0+0x0C;
ldr     r1,[r0,#0x8]   
C언어로 표현시 ; r1=*(r0+0x8);
ldr     r1,[r0],#0x0C
C언어로 표현시 ; r1=*(r0); r0=r0+0x0C;

! 는 읽은 offset 만큼 레지스터를 자동으로 더해 줌 (auto update)

댓글 없음:

댓글 쓰기