ARM 어셈블리 코드 관련 문의.. streqd... -.-;;
글쓴이: kis2u / 작성시간: 금, 2003/11/14 - 8:47오후
C 언어 코드를 XScale용 ARM GCC 컴파일러로 컴파일하여,
Objdump로 메모리에 적재될 코드로 떠서 분석하려는데..
이해가 안되는 부분이 있어서 문의 드립니다.. ^^;
예를 들어, 다음의 C 언어 소스 코드를..
#include <stdio.h>
int g;
void a()
{
int i;
i += 1;
}
int main()
{
int x;
x = 1;
a();
g = 2;
return 0;
}
컴파일 한후 실행 파일을 Objdump로 뜬 내역이 다음과 같습니다.
a.out: file format elf32-littlearm
Disassembly of section .init:
00008238 <_init>:
8238: e1a0c00d mov ip, sp
823c: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8240: e24cb004 sub fp, ip, #4 ; 0x4
8244: eb00001a bl 82b4 <call_gmon_start>
8248: eb00005d bl 83c4 <__do_global_ctors_aux>
824c: e91ba800 ldmdb fp, {fp, sp, pc}
Disassembly of section .plt:
00008250 <.plt>:
8250: e52de004 str lr, [sp, -#4]!
8254: e59fe010 ldr lr, [pc, #10] ; 826c <_init+0x34>
8258: e08fe00e add lr, pc, lr
825c: e5bef008 ldr pc, [lr, #8]!
8260: e59fc004 ldr ip, [pc, #4] ; 826c <_init+0x34>
8264: e08fc00c add ip, pc, ip
8268: e59cf000 ldr pc, [ip]
826c: 000081e0 andeq r8, r0, r0, ror #3
8270: e59fc004 ldr ip, [pc, #4] ; 827c <_init+0x44>
8274: e08fc00c add ip, pc, ip
8278: e59cf000 ldr pc, [ip]
827c: 000081d4 ldreqd r8, [r0], -r4
Disassembly of section .text:
00008280 <_start>:
8280: e3a0b000 mov fp, #0 ; 0x0
8284: e8bd0002 ldmia sp!, {r1}
8288: e1a0200d mov r2, sp
828c: e92d0001 stmdb sp!, {r0}
8290: e59f0010 ldr r0, [pc, #10] ; 82a8 <_start+0x28>
8294: e92d0001 stmdb sp!, {r0}
8298: e59f000c ldr r0, [pc, #c] ; 82ac <_start+0x2c>
829c: e59f300c ldr r3, [pc, #c] ; 82b0 <_start+0x30>
82a0: ebfffff2 bl 8270 <_init+0x38>
82a4: ebffffed bl 8260 <_init+0x28>
82a8: 0000840c andeq r8, r0, ip, lsl #8
82ac: 0000838c andeq r8, r0, ip, lsl #7
82b0: 00008238 andeq r8, r0, r8, lsr r2
000082b4 <call_gmon_start>:
82b4: e1a0c00d mov ip, sp
82b8: e92ddc00 stmdb sp!, {sl, fp, ip, lr, pc}
82bc: e59fa020 ldr sl, [pc, #20] ; 82e4 <call_gmon_start+0x30>
82c0: e59f3020 ldr r3, [pc, #20] ; 82e8 <call_gmon_start+0x34>
82c4: e08fa00a add sl, pc, sl
82c8: e79a3003 ldr r3, [sl, r3]
82cc: e24cb004 sub fp, ip, #4 ; 0x4
82d0: e3530000 cmp r3, #0 ; 0x0
82d4: 091bac00 ldmeqdb fp, {sl, fp, sp, pc}
82d8: e1a0e00f mov lr, pc
82dc: e1a0f003 mov pc, r3
82e0: e91bac00 ldmdb fp, {sl, fp, sp, pc}
82e4: 00008174 andeq r8, r0, r4, ror r1
82e8: 00000014 andeq r0, r0, r4, lsl r0
000082ec <__do_global_dtors_aux>:
82ec: e1a0c00d mov ip, sp
82f0: e92dd830 stmdb sp!, {r4, r5, fp, ip, lr, pc}
82f4: e59f2058 ldr r2, [pc, #58] ; 8354 <__do_global_dtors_aux+0x68>
82f8: e24cb004 sub fp, ip, #4 ; 0x4
82fc: e5923000 ldr r3, [r2]
8300: e1a05002 mov r5, r2
8304: e3530000 cmp r3, #0 ; 0x0
8308: 191ba830 ldmnedb fp, {r4, r5, fp, sp, pc}
830c: e59f1044 ldr r1, [pc, #44] ; 8358 <__do_global_dtors_aux+0x6c>
8310: e5913000 ldr r3, [r1]
8314: e5932000 ldr r2, [r3]
8318: e3520000 cmp r2, #0 ; 0x0
831c: 0a000009 beq 8348 <__do_global_dtors_aux+0x5c>
8320: e1a04001 mov r4, r1
8324: e5943000 ldr r3, [r4]
8328: e2833004 add r3, r3, #4 ; 0x4
832c: e5843000 str r3, [r4]
8330: e1a0e00f mov lr, pc
8334: e513f004 ldr pc, [r3, -#4]
8338: e5942000 ldr r2, [r4]
833c: e5923000 ldr r3, [r2]
8340: e3530000 cmp r3, #0 ; 0x0
8344: 1afffff6 bne 8324 <__do_global_dtors_aux+0x38>
8348: e3a03001 mov r3, #1 ; 0x1
834c: e5853000 str r3, [r5]
8350: e91ba830 ldmdb fp, {r4, r5, fp, sp, pc}
8354: 0001042c andeq r0, r1, ip, lsr #8
8358: 00010428 andeq r0, r1, r8, lsr #8
0000835c <fini_dummy>:
835c: e1a0c00d mov ip, sp
8360: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8364: e24cb004 sub fp, ip, #4 ; 0x4
8368: e91ba800 ldmdb fp, {fp, sp, pc}
0000836c <a>:
836c: e1a0c00d mov ip, sp
8370: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8374: e24cb004 sub fp, ip, #4 ; 0x4
8378: e24dd004 sub sp, sp, #4 ; 0x4
837c: e51b3010 ldr r3, [fp, -#16]
8380: e2832001 add r2, r3, #1 ; 0x1
8384: e50b2010 str r2, [fp, -#16]
8388: e91ba800 ldmdb fp, {fp, sp, pc}
0000838c <main>:
838c: e1a0c00d mov ip, sp
8390: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8394: e24cb004 sub fp, ip, #4 ; 0x4
8398: e24dd004 sub sp, sp, #4 ; 0x4
839c: e3a03001 mov r3, #1 ; 0x1
83a0: e50b3010 str r3, [fp, -#16]
83a4: ebfffff0 bl 836c <a>
83a8: e59f300c ldr r3, [pc, #c] ; 83bc <main+0x30>
83ac: e3a02002 mov r2, #2 ; 0x2
83b0: e5832000 str r2, [r3]
83b4: e3a00000 mov r0, #0 ; 0x0
83b8: ea000000 b 83c0 <main+0x34>
83bc: 000104f8 streqd r0, [r1], -r8
83c0: e91ba800 ldmdb fp, {fp, sp, pc}
000083c4 <__do_global_ctors_aux>:
83c4: e1a0c00d mov ip, sp
83c8: e92dd810 stmdb sp!, {r4, fp, ip, lr, pc}
83cc: e59f4024 ldr r4, [pc, #24] ; 83f8 <__do_global_ctors_aux+0x34>
83d0: e5943000 ldr r3, [r4]
83d4: e24cb004 sub fp, ip, #4 ; 0x4
83d8: e3730001 cmn r3, #1 ; 0x1
83dc: 091ba810 ldmeqdb fp, {r4, fp, sp, pc}
83e0: e1a0e00f mov lr, pc
83e4: e594f000 ldr pc, [r4]
83e8: e5343004 ldr r3, [r4, -#4]!
83ec: e3730001 cmn r3, #1 ; 0x1
83f0: 1afffffa bne 83e0 <__do_global_ctors_aux+0x1c>
83f4: e91ba810 ldmdb fp, {r4, fp, sp, pc}
83f8: 00010430 andeq r0, r1, r0, lsr r4
000083fc <init_dummy>:
83fc: e1a0c00d mov ip, sp
8400: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8404: e24cb004 sub fp, ip, #4 ; 0x4
8408: e91ba800 ldmdb fp, {fp, sp, pc}
Disassembly of section .fini:
0000840c <_fini>:
840c: e1a0c00d mov ip, sp
8410: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8414: e24cb004 sub fp, ip, #4 ; 0x4
8418: ebffffb3 bl 82ec <__do_global_dtors_aux>
841c: e91ba800 ldmdb fp, {fp, sp, pc}
여기서 main 에서 전역 변수 g 접근하는 코드 부분인
83a8: e59f300c ldr r3, [pc, #c] ; 83bc
부분에서 pc, #c 에 해당하는 부분은,
83bc: 000104f8 streqd r0, [r1], -r8
이 부분인데.. 이 부분 해석이 잘 되지 않는군요.. ^^;
잘 아시는 분은 설명 해주시면 감사하겠습니다.. ^^;
Forums:


제가 알기론
저도 요새 분석하면서 공부하고 있는데요.
바로 위 코드보시면 branch이기 때문에 무조건 분기한다고 보면 되고요.
따라서 해당되는 위치로 오지 않게 됩니다. 이것은 83bc 위치에 있는 값이 저장소로 쓰인다는 것이고요.
역추적해보니 변수의 포인터로 사용하는 듯 합니다.(이것은 83bc의 값, 000104f8을 r3에 넣고 다시 [r3]로 참조하는 것을 보면 해석할 수 있습니다)
----
MyWiki http://linu.sarang.net
----
;p $ rm -rf ~ && mkdir ~ && wget $열정 and $연애
----
http://linu.sarang.net, http://wbhacker.tistory.com
11년이 지났군요.
저도 엄청 궁금했는데.
결국 그냥 데이터가 담긴 곳의 주소 값이더군요.
근데 그 주소값이 cpu 명령어로 해석이 되서 저렇게 나오는 거네요.
하지만 저 주소 번지로 가서 실행이 되지는 않네요.
결론 : 그냥 주소값(CPU 명령어가 아님)인데, objdump가 명령어로 해석해서 화면에 뿌려줌.
댓글 달기