某本书上看到的面试题,不太懂。有木有人帮忙解决一下子?最好既懂C又懂点汇编的来
某本书上看到的面试题,不太懂。。有木有人帮忙解决一下?最好既懂C又懂点汇编的来
以下两段C代码转换成汇编指令后,感觉都一样。但是输出完全不一样啊?
对应汇编如下:
这段代码004016CD处把字符串的首地址用 dword ptr [ebp-0Ch],保存起来,然后在004016E2处把保存的首地址用eax寄存器储存,然后把eax压入栈,然后输出,但是这个代码输出的结果是一堆乱码。
而下面这段代码
对应的汇编如下:
同样是把字符串首地址保存起来,然后能正确输出结果。
这是为何?
------解决方案--------------------
第一个返回值是栈上的局部变量的地址,经典的错误。
第二个返回值是常量区地址,永远有效,正确。
------解决方案--------------------
或者说:
lea eax,[ebp-0Ch] ; eax = ebp-0Ch
mov eax,dword ptr [ebp-4] ; eax = *(ebp-4)
------解决方案--------------------
第一个: 不要返回栈上对象的地址或引用,否则后果自负。
------解决方案--------------------
一个是拷贝值(MOV), 一个是取地址(LEA)。
以下两段C代码转换成汇编指令后,感觉都一样。但是输出完全不一样啊?
char *strA()
{
char str[]="hello world";
return str;
}
对应汇编如下:
152: char str[]="hello world";
004016C8 mov eax,[string "hello world" (0046f020)]
004016CD mov dword ptr [ebp-0Ch],eax
004016D0 mov ecx,dword ptr [string "hello world"+4 (0046f024)]
004016D6 mov dword ptr [ebp-8],ecx
004016D9 mov edx,dword ptr [string "hello world"+8 (0046f028)]
004016DF mov dword ptr [ebp-4],edx
153: return str;
004016E2 lea eax,[ebp-0Ch]
154: }
这段代码004016CD处把字符串的首地址用 dword ptr [ebp-0Ch],保存起来,然后在004016E2处把保存的首地址用eax寄存器储存,然后把eax压入栈,然后输出,但是这个代码输出的结果是一堆乱码。
而下面这段代码
char *strA()
{
char *str="hello world";
return str;
}
对应的汇编如下:
157: char *str="hello world";
004016C8 mov dword ptr [ebp-4],offset string "hello world" (0046f020)
158: return str;
004016CF mov eax,dword ptr [ebp-4]
同样是把字符串首地址保存起来,然后能正确输出结果。
这是为何?
------解决方案--------------------
第一个返回值是栈上的局部变量的地址,经典的错误。
第二个返回值是常量区地址,永远有效,正确。
------解决方案--------------------
或者说:
lea eax,[ebp-0Ch] ; eax = ebp-0Ch
mov eax,dword ptr [ebp-4] ; eax = *(ebp-4)
------解决方案--------------------
第一个: 不要返回栈上对象的地址或引用,否则后果自负。
------解决方案--------------------
一个是拷贝值(MOV), 一个是取地址(LEA)。