能力值:
(RANK:350 )
|
-
-
2 楼
lea ebx, [ebp+10]
是将ebp+10这个值放到ebx
mov [ebx], eax
将eax的值赋给变量
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我不用pascal的,所以我写了一个C++的程序模拟那个Pascal过程:
void MyAdd2(int y, int x, int& res) //考虑了C++和Pascal传递的顺序不同
{
res = x + y;
}
反汇编的结果:
00401290 /$ 55 PUSH EBP
00401291 |. 89E5 MOV EBP,ESP
00401293 |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00401296 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00401299 |. 01D0 ADD EAX,EDX
0040129B |. 8B55 10 MOV EDX,DWORD PTR SS:[EBP+10] ; 取ret, 注意不是lea eax, ...
0040129E |. 8902 MOV DWORD PTR DS:[EDX],EAX
004012A0 |. 5D POP EBP
004012A1 \. C3 RETN
|
能力值:
(RANK:350 )
|
-
-
4 楼
书和你的C程序都没错,注意CALL前的入口参数,不要只注意CALL里面的指令形式。
用C写的程序,参数入栈形式是类似如下:
00401021 lea eax,dword ptr ss:[esp] //注意这里和书中不同,所以CALL里面就不同了
00401025 push eax
00401026 push 2
00401028 push 1
0040102A call dos.00401000
{
00401000 mov eax,dword ptr ss:[esp+8]
00401004 mov ecx,dword ptr ss:[esp+4]
00401008 mov edx,dword ptr ss:[esp+C]//将esp+C这个值指向的数据给EDX
(就是00401021 lea eax,xxx 这个EAX的值)
0040100C add ecx,eax
0040100E mov dword ptr ds:[edx],ecx
}
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢谢. 懂了.
|
|
|