ARM 어셈블리 코드 관련 문의.. streqd... -.-;;

kis2u의 이미지

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
이 부분인데.. 이 부분 해석이 잘 되지 않는군요.. ^^;

잘 아시는 분은 설명 해주시면 감사하겠습니다.. ^^;

조성현의 이미지

저도 요새 분석하면서 공부하고 있는데요.

바로 위 코드보시면 branch이기 때문에 무조건 분기한다고 보면 되고요.

따라서 해당되는 위치로 오지 않게 됩니다. 이것은 83bc 위치에 있는 값이 저장소로 쓰인다는 것이고요.

역추적해보니 변수의 포인터로 사용하는 듯 합니다.(이것은 83bc의 값, 000104f8을 r3에 넣고 다시 [r3]로 참조하는 것을 보면 해석할 수 있습니다)
----
MyWiki http://linu.sarang.net
----
;p $ rm -rf ~ && mkdir ~ && wget $열정 and $연애

행인의 이미지

저도 엄청 궁금했는데.
결국 그냥 데이터가 담긴 곳의 주소 값이더군요.
근데 그 주소값이 cpu 명령어로 해석이 되서 저렇게 나오는 거네요.
하지만 저 주소 번지로 가서 실행이 되지는 않네요.

결론 : 그냥 주소값(CPU 명령어가 아님)인데, objdump가 명령어로 해석해서 화면에 뿌려줌.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.