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)
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기