BASM学习知识介绍
program Test1;
{$APPTYPE CONSOLE}
uses
SysUtils;function Add1(X,Y,Z,A,B,C:Integer):Integer;
begin Result := X+Y+Z+A+B+C; end;function Add(X,Y:Integer):Integer;
asm add eax, edx mov ebx, eax end;var
Result : Integer; begin Result := Add1(13,12,31,41,51,61); Writeln(Result);Result := Add(12347,12374);
Writeln(Result);Result := 4;
Inc(Result,9);Writeln(Result);
readln; end.Test1.dpr.22: Result := Add1(13,12,31,41,51,61);
00408805 6A29 push $29//压入 00408807 6A33 push $33//压入 00408809 6A3D push $3d//压入 当参数超过3个后 编译器会压入参数到栈 0040880B B91F000000 mov ecx,$0000001f 00408810 BA0C000000 mov edx,$0000000c 00408815 B80D000000 mov eax,$0000000d 0040881A E845FFFFFF call Add1//调用ADD1 0040881F 8BD8 mov ebx,eax Test1.dpr.23: Writeln(Result); 00408821 A104934000 mov eax,[$00409304] 00408826 8BD3 mov edx,ebx 00408828 E80FA9FFFF call @Write0Long 0040882D E856A9FFFF call @WriteLn 00408832 E871A1FFFF call @_IOTest Test1.dpr.25: Result := Add(12347,12374); 00408837 BA56300000 mov edx,$00003056 0040883C B83B300000mov eax,$0000303b 00408841 E836FFFFFF call Add 00408846 8BD8mov ebx,eax Test1.dpr.26: Writeln(Result); 00408848 A104934000 mov eax,[$00409304] 0040884D 8BD3mov edx,ebx 0040884F E8E8A8FFFFcall @Write0Long 00408854 E82FA9FFFFcall @WriteLn 00408859 E84AA1FFFFcall @_IOTest Test1.dpr.28: Result := 4; 0040885E BB04000000mov ebx,$00000004 Test1.dpr.29: Inc(Result,9); 00408863 83C309 add ebx,$09 Test1.dpr.31: Writeln(Result); 00408866 A104934000 mov eax,[$00409304] 0040886B 8BD3 mov edx,ebx 0040886D E8CAA8FFFFcall @Write0Long 00408872 E811A9FFFF call @WriteLn 00408877 E82CA1FFFF call @_IOTest Test1.dpr.32: readln; 0040887C A170934000 mov eax,[$00409370] 00408881 E8F6A5FFFF call @ReadLn 00408886 E81DA1FFFF call @_IOTestTest1.dpr.9: begin 00408764 55 push ebp //做标志栈,以后会对地址偏移量进行操作 00408765 8BEC mov ebp,esp//把esp栈地址值压入EBP进行操作 Test1.dpr.10: Result := X+Y+Z+A+B+C; 00408767 03D0 add edx,eax 00408769 03CA add ecx,edx 0040876B 034D10 add ecx,[ebp+$10]//(基地址+偏移量) 0040876E 034D0Cadd ecx,[ebp+$0c]//(同上) 00408771 034D08 add ecx,[ebp+$08] 00408774 8BC1 mov eax,ecx//结果存到 eax Test1.dpr.11: end; 00408776 5D pop ebp//ebp地址为034D08,直接从这个位置弹栈,清理数据 00408777 C20C00 ret $000c 0040877A 8BC0 mov eax,eax Test1.dpr.15: add eax, edx 0040877C 01D0 add eax,edx Test1.dpr.16: mov ebx, eax 0040877E 89C3 mov ebx,eax Test1.dpr.17: end; 00408780 C3 ret 00408781 8D4000 lea eax,[eax+$00] 00408784 55 push ebp 00408785 8BEC mov ebp,esp 00408787 33C0 xor eax,eax 00408789 55 push ebp 0040878A 68A3874000push $004087a3
===================================
为了验证整型读栈的方法 写了一个函数做 在函数执行前编译器已经为我们做了一个push ebp; 这样就是压入了16位,我们就可以通过+16位来读刚刚压入的4位的数据。 function Add2(X,Y,Z,A,B,C:Integer):Integer; asm mov ebx,[ebp+$10] mov eax,[ebp+$10-$04] mov ecx,[ebp+$10-$08] mov eax,ebx end; ebx中显示的A EAX中显示的B ECX中显示的C