C code와 nasm 코드의 argument 전달 방식에 질문있습니다.
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전달시 주소가 저장되는것인지.. 아니면 값이 넘어가는것인지 궁금합니다
읽어주셔서 감사하고
같이 고민해주실분 구합니다~~
ndisasm
ndisasm은 아무 옵션도 주지 않으면 16비트 코드를 가정합니다. 32비트 코드를 16비트로 디스어셈블했으니 엉터리 어셈블리가 나오는 것입니다.
ndisasm -b 32 로 옵션 주시고 다시 해보세요.
댓글 달기