function 에서 참조인자와 반환인자에 따라서 ..어셈블리가 다륵

catzbi의 이미지

// test.cpp
#include  <stdio.h>

int nothingR ( int& a ) { 
	return a; 
}
int nothingP ( int* p ){ 
	return *p; 
}
int& nothingRR ( int& a ) { 
	return a; 
}
int* nothingPP ( int* p ) { 
       return p; 
}       

int main() { 
	int a =1 ; 
	nothingR ( a ) ; 
	nothingP ( &a ) ;
	nothingRR (a );
	nothingPP ( &a ) ;
	
return 0 ; 

}

// test.s sh:compiled> g++ -S tets.cpp

	.file	"t.cpp"
	.version	"01.01"
gcc2_compiled.:
.text
	.align 4
.globl nothingR__FRi
	.type	 nothingR__FRi,@function
nothingR__FRi:
.LFB1:
	pushl	%ebp
.LCFI0:
	movl	%esp, %ebp
.LCFI1:
	movl	8(%ebp), %eax
	movl	(%eax), %eax
	movl	%eax, %eax
	popl	%ebp
	ret
.LFE1:
.Lfe1:
	.size	 nothingR__FRi,.Lfe1-nothingR__FRi
	.align 4
.globl nothingP__FPi
	.type	 nothingP__FPi,@function
nothingP__FPi:
.LFB2:
	pushl	%ebp
.LCFI2:
	movl	%esp, %ebp
.LCFI3:
	movl	8(%ebp), %eax
	movl	(%eax), %eax
	movl	%eax, %eax
	popl	%ebp
	ret
.LFE2:
.Lfe2:
	.size	 nothingP__FPi,.Lfe2-nothingP__FPi
	.align 4
.globl nothingRR__FRi
	.type	 nothingRR__FRi,@function
nothingRR__FRi:
.LFB3:
	pushl	%ebp
.LCFI4:
	movl	%esp, %ebp
.LCFI5:
	movl	8(%ebp), %eax
	movl	%eax, %eax
	popl	%ebp
	ret
.LFE3:
.Lfe3:
	.size	 nothingRR__FRi,.Lfe3-nothingRR__FRi
	.align 4
.globl nothingPP__FPi
	.type	 nothingPP__FPi,@function
nothingPP__FPi:
.LFB4:
	pushl	%ebp
.LCFI6:
	movl	%esp, %ebp
.LCFI7:
	movl	8(%ebp), %eax
	movl	%eax, %eax
	popl	%ebp
	ret
.LFE4:
.Lfe4:
	.size	 nothingPP__FPi,.Lfe4-nothingPP__FPi
	.align 4
.globl main
	.type	 main,@function
main:
.LFB5:
	pushl	%ebp
.LCFI8:
	movl	%esp, %ebp
.LCFI9:
	subl	$8, %esp
.LCFI10:
	movl	$1, -4(%ebp)
	subl	$12, %esp
	leal	-4(%ebp), %eax
	pushl	%eax
.LCFI11:
	call	nothingR__FRi
	addl	$16, %esp
	subl	$12, %esp
	leal	-4(%ebp), %eax
	pushl	%eax
	call	nothingP__FPi
	addl	$16, %esp
	subl	$12, %esp
	leal	-4(%ebp), %eax
	pushl	%eax
	call	nothingRR__FRi
	addl	$16, %esp
	subl	$12, %esp
	leal	-4(%ebp), %eax
	pushl	%eax
	call	nothingPP__FPi
	addl	$16, %esp
	movl	$0, %eax
	leave
	ret
.LFE5:
.Lfe5:
	.size	 main,.Lfe5-main
	.ident	"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.2 2.96-112.7.2)"

참조, 포인터 입력과 출력에 관한 부분이 궁금했습니다. 우선은 올려놓겠습니당

mov (%eax ) , %eax ; 이렇게 되어있는데요..
대충은 감이 오는데 그부분만 설명 부닥 드립니다.

alsong의 이미지

Assembly Example (이호)
리눅스에서 사용하는 어셈블리 문법에 대해서 (특히 x86에서) 간략히 요약한 글입니다

Quote:
메모리 참조 : AT&T와 Intel에서 메모리 주소를 참조하는 방법(indexing, indirection)에는 표기법상 약간의 차이가 있다.
AT&T : section:immed32(base, index, scale)
Intel : sectioin:[base + index * scale + immed32]

이는 base + index * scale + immed32 주소를 나타내게 된다. 이들 모두를 반드시 지정해야 하는 것은 아니지만 immed32나 base 중의 하나는 반드시 지정해야 한다. 주소 지정의 예를 들어보자. eax 레지스터가 가리키는 주소의 값을 참조하는 경우 :

AT&T : (%eax)
Intel : [eax]

레지스터에 변수(var)의 옵셋을 합한 주소를 참조하는 경우 :

AT&T : var(%eax)
Intel : [eax + var]

4바이트 단위로 된 정수 배열(int array[])의 eax번째 값을 참조하는 경우 (int array[eax]) :

AT&T : array(, %eax, 4)
Intel : [eax * 4 + array]

위 배열에서 ebx 인덱스에서 시작하여 eax번째 값을 참조하는 경우 (int array[ebx + eax]) :

AT&T : array(%ebx, %eax, 4)
Intel : [ebx + eax * 4 + array]

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.