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을 검색하면 됩니다.
add r1,r2,r3 이런식으로 되어있으면 add같은 어셈코드를 니모닉(mnemonics) 이라고 합니다.
예전에는 니모닉을 개발자가 직접 코딩해서 어셈블러를 통해 opcode 로 변경하는 과정을 통해서 실행 파일을 만들었습니다.
지금은 어셈블러를 거의 사용하지 않기 때문에 디버깅시 opcode와 니모닉만 주로 보게 되고 있습니다.
기계어라고 말하는 부분은 opcode가 되고, 어셈이라 표현되는 부분은 니모닉이 되겠습니다. opcode와 니모닉은 1:1로 매칭되지 않습니다. 이유는 add하나도 뒤쪽에 레지스터냐 메모리를 access가 되냐에 따라 opcode가 달라지게 됩니다. opcode를 instruction set 이라고도 합니다. ARM의 경우에는 ARM instruction set을 검색하면 됩니다.
피드 구독하기:
글 (Atom)