레이블이 asm인 게시물을 표시합니다. 모든 게시물 표시
레이블이 asm인 게시물을 표시합니다. 모든 게시물 표시

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)

2015년 1월 1일 목요일

asm 과 니모닉

디버깅을 하다보면 asm(어셈) 코드를 종종 보게 됩니다.
add r1,r2,r3 이런식으로 되어있으면 add같은 어셈코드를 니모닉(mnemonics) 이라고 합니다.
예전에는 니모닉을 개발자가 직접 코딩해서 어셈블러를 통해 opcode 로 변경하는 과정을 통해서 실행 파일을 만들었습니다.
지금은 어셈블러를 거의 사용하지 않기 때문에 디버깅시 opcode와 니모닉만 주로 보게 되고 있습니다.

기계어라고 말하는 부분은 opcode가 되고, 어셈이라 표현되는 부분은 니모닉이 되겠습니다. opcode와 니모닉은 1:1로 매칭되지 않습니다. 이유는 add하나도 뒤쪽에 레지스터냐 메모리를 access가 되냐에 따라 opcode가 달라지게 됩니다. opcode를 instruction set 이라고도 합니다. ARM의 경우에는 ARM instruction set을 검색하면 됩니다.