C code와 nasm 코드의 argument 전달 방식에 질문있습니다.

revival4u의 이미지

C code :

int func(int a, int b, char c, char d, int e,
        double f, char g){ 
    a = 1+1;
    b = 2+2;
 
    c = 'c';
    d = 'd';
 
    e = 1+2;
 
    f = 1.0+1.0;
 
    g = 'g';
 
 
 
}
 
int main(void){
    func(1, 2, 'a', 'b', 3, 1.0, 'c');
}
 

nasm code

00000000  55                push bp
00000001  89E5              mov bp,sp
00000003  83EC18            sub sp,byte +0x18
00000006  8B4510            mov ax,[di+0x10]
00000009  8B5514            mov dx,[di+0x14]
0000000C  8B4D24            mov cx,[di+0x24]
0000000F  8845FC            mov [di-0x4],al
00000012  8855F8            mov [di-0x8],dl
00000015  8B451C            mov ax,[di+0x1c]
00000018  8945F0            mov [di-0x10],ax
0000001B  8B4520            mov ax,[di+0x20]
0000001E  8945F4            mov [di-0xc],ax
00000021  884DEC            mov [di-0x14],cl
00000024  C745080200        mov word [di+0x8],0x2
00000029  0000              add [bx+si],al
0000002B  C7450C0400        mov word [di+0xc],0x4
00000030  0000              add [bx+si],al
00000032  C645FC63          mov byte [di-0x4],0x63
00000036  C645F864          mov byte [di-0x8],0x64
0000003A  C745180300        mov word [di+0x18],0x3
0000003F  0000              add [bx+si],al
00000041  DD05              fld qword [di]
00000043  A800              test al,0x0
00000045  0000              add [bx+si],al
00000047  DD5DF0            fstp qword [di-0x10]
0000004A  C645EC67          mov byte [di-0x14],0x67
0000004E  C9                leave
0000004F  C3                ret
00000050  8D4C24            lea cx,[si+0x24]
00000053  0483              add al,0x83
00000055  E4F0              in al,0xf0
00000057  FF71FC            push word [bx+di-0x4]
0000005A  55                push bp
0000005B  89E5              mov bp,sp
0000005D  51                push cx
0000005E  83EC24            sub sp,byte +0x24
00000061  C744241C63        mov word [si+0x24],0x631c
00000066  0000              add [bx+si],al
.
.
.

아래와 같이 C와 asm이 매칭이 되는데요...

00000024 C745080200 mov word [di+0x8],0x2 ; a = 1+1;

0000002B C7450C0400 mov word [di+0xc],0x4 ; b = 2+2;

00000032 C645FC63 mov byte [di-0x4],0x63 ; c = 'c';
00000036 C645F864 mov byte [di-0x8],0x64 ; d = 'd';
0000003A C745180300 mov word [di+0x18],0x3 ; e = 1+2;

00000041 DD05 fld qword [di] ; f = 1.0+1.0;

0000004A C645EC67 mov byte [di-0x14],0x67 ; g = 'g';

여기서 질문이..

1. 제가 알기론 ebx를 이용해서 argument에 접근하는걸로 알고있는데 di가 나오는군요.. 왜 그런지 이해가 안됩니다.

2. int형 a, b, e는 제가 아는바와 같이 기준점으로 부터 return address와 push ebp 구문으로 인해
di+0x08, di+0x0c, di+0x018과 같이 (하지만 여기서 왜 di가 쓰이는지는 모르지만 제가알고있는 ebx의 역할과 같다는 가정하에..)
argument에 접근을 하고 있습니다. 하지만 char형과 double형은 왜 저렇게 주소접근을 하는지 궁금합니다.
특히 c와 d변수는 di+0x10, di+0x14가 아니라 왜 di-0x4, di-0x8로 접근하는지 왜 그렇게 되는지가요..

3. float및 double과 같이 부동소수점은 메모리의 어느부분에 저장이 되고 argument전달시 주소가 저장되는것인지.. 아니면 값이 넘어가는것인지 궁금합니다

읽어주셔서 감사하고

같이 고민해주실분 구합니다~~

feanor의 이미지

ndisasm은 아무 옵션도 주지 않으면 16비트 코드를 가정합니다. 32비트 코드를 16비트로 디스어셈블했으니 엉터리 어셈블리가 나오는 것입니다.

ndisasm -b 32 로 옵션 주시고 다시 해보세요.

댓글 달기

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