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가 명령어로 해석해서 화면에 뿌려줌.
댓글 달기