Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Подскажите что не так делаю Delphi +asm
Посл.ответ Сообщение

Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 октября 2009 20:27 · Поправил: 3uM6a6Ba
· Личное сообщение · #1

Может не так перевел в архиве 2 исходника 1ый на сях норм компилится второй на Delphi + asm вылетает




Ранг: 500.6 (!), 7thx
Активность: 0.260
Статус: Участник

Создано: 12 октября 2009 06:41
· Личное сообщение · #2

Вылетает на procedure Tmain.crypt1 ?



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 12 октября 2009 10:23
· Личное сообщение · #3

3uM6a6Ba Ассемблер, видимо, пишешь не понимая или память подвела ? Команда pop извлекает из стека и обычно стоит в конце. Команда сохранения в стеке называется push




Ранг: 500.6 (!), 7thx
Активность: 0.260
Статус: Участник

Создано: 12 октября 2009 10:56
· Личное сообщение · #4

NIKOLA пишет:
Ассемблер, видимо, пишешь не понимая или память подвела ?


в Си примере именно так три ПОПА в начале и еще в конце процедуры.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 12 октября 2009 11:00 · Поправил: Coderess
· Личное сообщение · #5

dll'ки в архиве не хватает



Code:
  1. procedure crypt1(const mass:array of ansichar; const const1,const2:integer);stdcall external 'dll.dll' index 1;
  2. procedure crypt(const mass:array of ansichar;const const1,const2:integer); stdcall external 'dll.dll' index 2;


P.S.
Вобще в книгах пишут, что лучше экспортировать по имени, а не индексу.

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 октября 2009 19:45
· Личное сообщение · #6

NIKOLA Да именно на Crypt1



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 октября 2009 19:52
· Личное сообщение · #7

tundra37 Для этого я положил второй файл на сях, который компилиться и норм работает!!!
а в дельфях болт(это во первых), во вторых почему Вы так уверены ,что при begin он туда ничего не положет ??? , а как же переменные которые передаются в процедуру ???

В общем меня наводит на мысль, что в процедуру параметры как-то не так передаются crypt1, потому как
смотрю в дебаг на сях после захода в проседуру три пуша и потом уже асм попит..., а в дельфях два и какой-то мусор непоняный мне




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 12 октября 2009 19:54
· Личное сообщение · #8

особо не смотрел, но мне кажется
procedure Tmain.crypt1(mass: array of char; const const1, const2: integer);
надо объявить как stdcall

-----
[nice coder and reverser]




Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 октября 2009 20:07
· Личное сообщение · #9

Hellspawn Неа не помогло вываливат ексепшен в
Code:
  1. @loop8:
  2.                  mov cl,byte [esp+$14]
  3.                  mov edx,dword [esp+$20]
  4.     add cl,3
  5.     shr dx,cl
  6.                  test dl,1
  7.                  je @loop10
  8.                  mov edx,dword [ebx+esi*4] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<




Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 октября 2009 20:09
· Личное сообщение · #10

я уже думал что в сях массив по ссылке передается потому procedure(var mass:..........);stdcall; нифига



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 октября 2009 20:13
· Личное сообщение · #11

вот что в дебаге
Это голова функции crypt1 на делфи
Code:
  1. Unit2.pas.134: begin
  2. 004ADD58 55               push ebp
  3. 004ADD59 8BEC             mov ebp,esp
  4. 004ADD5B 8B450C           mov eax,[ebp+$0c]
  5. 004ADD5E 8B5510           mov edx,[ebp+$10]
  6. 004ADD61 85D2             test edx,edx
  7. 004ADD63 780A             js $004add6f
  8. 004ADD65 C1EA02           shr edx,$02
  9. 004ADD68 8B0C90           mov ecx,[eax+edx*4]
  10. 004ADD6B 4A               dec edx
  11. 004ADD6C 51               push ecx
  12. 004ADD6D 79F9             jns $004add68
  13. 004ADD6F 89650C           mov [ebp+$0c],esp
  14. Unit2.pas.136: pop edi
  15. 004ADD72 5F               pop edi

А вот на Сях
Code:
  1. Unit1.cpp.351: void crypt1(const char* Mass, int Const1, int Const2)
  2. 00402028 55               push ebp
  3. 00402029 8BEC             mov ebp,esp
  4. 0040202B 53               push ebx
  5. 0040202C 56               push esi
  6. 0040202D 57               push edi
  7. Unit1.cpp.355: pop edi
  8. 0040202E 5F               pop edi

объясните почему в сях есть вход, есть 3 пуша, а в дельфи мммм




Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 12 октября 2009 20:21
· Личное сообщение · #12

3uM6a6Ba
Я выравнивал стёк этими попами для си, а дельфи стёк опускает хрен знает на сколько. Видать надо по другому объявить колл.

-----
Research For Food





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 12 октября 2009 21:53
· Личное сообщение · #13

3uM6a6Ba пишет:
в архиве 2 исходника


где архив??

то что приведено в первом посте для кода функции crypt1

procedure Tmain.crypt1(mass: array of char; const const1, const2: integer);
begin
asm
pop edi
pop esi
pop ebx
pop ebp
mov eax,dword [esp+C]
sub esp,8
push esi
xor esi,esi
test eax,eax
jbe @loop11

врядли может быть скомпилировано делфи в код приведенный в посте 11

004ADD58 55 push ebp
004ADD59 8BEC mov ebp,esp
004ADD5B 8B450C mov eax,[ebp+$0c]
004ADD5E 8B5510 mov edx,[ebp+$10]
004ADD61 85D2 test edx,edx
004ADD63 780A js $004add6f

в коде топикстартера сначала из стека извлекаются все параметры велючая адрес возврата, а потом доступ esp+C в неизвестно куда

-----
127.0.0.1, sweet 127.0.0.1





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 12 октября 2009 22:37 · Поправил: daFix
· Личное сообщение · #14

Может кто нибудь перевести эти функции на язык высокого уровня? Чтобы не играться со стёком?
У меня с этим проблемы. Даже если мы выровним тут стёк, тогда всёравно валимся, ибо дельфя в любом случае зачем-то пихает 5! аргументов с CALL!

OKOB пишет:
врядли может быть скомпилировано делфи в код приведенный в посте 11


Невероятно, но факт! Сам не могу понять зачем он так стёк опускает

-----
Research For Food




Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 13 октября 2009 00:49 · Поправил: _ruzmaz_
· Личное сообщение · #15

Попробуй вот что:
- объявляй Tmain.crypt1 как cdecl (исправлено) => в результате этого параметры будут
передаваться так, как скорее всего =) и предполагалось;
- делай эту процедуру ассемблерной, а не обычной процедурой с ассемблерной вставкой (просто
удали begin и один end) => перед первой инструкцией в исходнике будут идти только push ebp
и mov ebp, esp;
- попы) в начале меняй на
mov esp, ebp
pop ebp => выполнение этих инструкций вернет стек и регистры в состояние как
в самом начале функи (для чего до этого и были попы)).



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 октября 2009 01:46 · Поправил: 3uM6a6Ba
· Личное сообщение · #16

Вот что сделал все-равно болт!
Code:
  1.   private
  2.     { Private declarations }
  3.     procedure fillmass();
  4.     procedure crc();
  5.     procedure gen (tip:integer);
  6. procedure crypt1(mass:pointer{array of ansichar};const1,const2:integer);stdcall;
  7. procedure crypt(mass:pointer{array of ansichar};const1,const2:integer);
  8. Public declarations }
  9.   end;
  10. var
  11.   main: Tmain;
  12.   crcdata:array[0..255]of longint;
  13.   recvbuf:array[0..511]of ansichar;
  14. implementation
  15. {$*.dfm}
  16. procedure Tmain.Button2Click(Sender: TObject);
  17. begin
  18.  gen($00082B98);
  19.  crypt(@recvbuf,$0000A3FE,$80);
  20. end;
  21.  
  22. procedure Tmain.crc;
  23. begin
  24. fillmass();
  25. asm
  26.    mov esi, $1f8
  27.    lea edx, recvbuf
  28.    add edx, 8
  29.    mov eax, $ffffffff
  30.    @Loop20:
  31.                  xor ecx,ecx
  32.         mov cl,byte ptr ds:[edx]
  33.                  xor ecx,eax
  34.         and ecx,$ff
  35.                  mov ebx,dword ptr ds:[ecx*4+crcdata]
  36.                  shr eax,8
  37.                  xor eax,ebx
  38.         inc edx
  39.                  dec esi
  40.    jnz @Loop20
  41.  
  42.          mov dword [recvbuf + 4], eax
  43. end;
  44. end;
  45.  
  46. procedure Tmain.crypt(mass:pointer{array of ansichar};const1, const2: integer);
  47. begin
  48. crypt1(mass,const1, const2);
  49. asm
  50.                  mov edi, Const2
  51.                  mov ebx, Const1
  52.                  mov esi, Mass
  53.                  xor eax,eax
  54.                  test edi,edi
  55.                  jbe @l2
  56.                  movzx edx,bx
  57.                  mov ecx,edx
  58.                  imul ecx,ecx,$19212
  59.                  jmp @l1
  60.                  lea ecx,dword ptr ds:[ecx]
  61. @l1:
  62.                  xor dword ptr ds:[esi+eax*4],ecx
  63.                  inc eax
  64.                  add ecx,edx
  65.         cmp eax,edi
  66.                  jb @l1
  67. @l2:
  68. end;
  69. end;
  70.  
  71. procedure Tmain.crypt1(mass:pointer{ array of ansichar};const1,const2:integer);
  72. asm
  73.     mov esp, ebp
  74.     pop ebp
  75.  
  76.                  mov eax,dword [esp+$C]
  77.                  sub esp,8
  78.                  push esi
  79.     xor esi,esi
  80.                  test eax,eax
  81.                  jbe @loop11
  82.     push ebx
  83.                  mov ebx,dword [esp+$14]
  84.                  push ebp
  85.     push edi
  86.                  lea esp,dword [esp]
  87. @loop1:
  88.                  mov dword [esp+$14],0
  89.                  mov eax,4
  90.                  lea ecx,dword [ecx]
  91. @loop2:
  92.                  mov edx,dword [esp+$20]
  93.                  mov cx,word [esp+$14]
  94.     shr dx,cl
  95.                  test dl,1
  96.                  je @loop4
  97.                  mov edx,dword [ebx+esi*4]
  98.                  lea ecx,dword [eax-4]
  99.     mov edi,3
  100.     shl edi,cl
  101.                  mov dword [esp+$10],edx
  102.                  lea ecx,dword [eax-4]
  103.     and edx,edi
  104.     mov ebp,edx
  105.     shr ebp,cl
  106.                  cmp ebp,2
  107.                  je @loop3
  108.                  cmp ebp,1
  109.                  jnz @loop4
  110. @loop3:
  111.                  mov ecx,dword [esp+$10]
  112.     or ecx,edi
  113.     not edx
  114.     and ecx,edx
  115.                  mov dword [ebx+esi*4],ecx
  116. @loop4:
  117.                  mov cl,byte [esp+$14]
  118.                  mov edx,dword [esp+$20]
  119.     inc cl
  120.     shr dx,cl
  121.     test dl,1
  122.                  je @loop6
  123.                  mov edx,dword [ebx+esi*4]
  124.                  lea ecx,dword [eax-2]
  125.                  mov edi,3
  126.     shl edi,cl
  127.                  mov dword [esp+$10],edx
  128.                  lea ecx,dword [eax-2]
  129.     and edx,edi
  130.                  mov ebp,edx
  131.     shr ebp,cl
  132.     cmp ebp,2
  133.                  je @loop5
  134.                  cmp ebp,1
  135.                  jnz @loop6
  136. @loop5:
  137.                  mov ecx,dword [esp+$10]
  138.     or ecx,edi
  139.     not edx
  140.     and ecx,edx
  141.                  mov dword [ebx+esi*4],ecx
  142. @loop6:
  143.                  mov cl,byte [esp+$14]
  144.                  mov edx,dword [esp+$20]
  145.     add cl,2
  146.     shr dx,cl
  147.     test dl,1
  148.                  je @loop8
  149.                  mov edx,dword [ebx+esi*4]
  150.     mov ecx,eax
  151.     mov edi,3
  152.     shl edi,cl
  153.                  mov dword [esp+$10],edx
  154.                  and edx,edi
  155.     mov ebp,edx
  156.     shr ebp,cl
  157.     cmp ebp,2
  158.                  je @loop7
  159.     cmp ebp,1
  160.                  jnz @loop8
  161. @loop7:
  162.                  mov ecx,dword [esp+$10]
  163.     or ecx,edi
  164.     not edx
  165.     and ecx,edx
  166.                  mov dword [ebx+esi*4],ecx
  167. @loop8:
  168.                  mov cl,byte [esp+$14]
  169.                  mov edx,dword [esp+$20]
  170.     add cl,3
  171.     shr dx,cl
  172.                  test dl,1
  173.                  je @loop10
  174.                  mov edx,dword [ebx+esi*4]
  175.                  lea ecx,dword [eax+2]
  176.     mov edi,3
  177.     shl edi,cl
  178.                  mov dword [esp+$10],edx
  179.     and edx,edi
  180.     mov ebp,edx
  181.     shr ebp,cl
  182.                  cmp ebp,2
  183.                  je @loop9
  184.                  cmp ebp,1
  185.                  jnz @loop10
  186. @loop9:
  187.                  mov ecx,dword [esp+$10]
  188.     or ecx,edi
  189.     not edx
  190.     and ecx,edx
  191.                  mov dword [ebx+esi*4],ecx
  192. @loop10:
  193.                  mov edi,dword [esp+$14]
  194.     add edi,4
  195.     add eax,8
  196.                  cmp eax,$24
  197.                  mov dword [esp+$14],edi
  198.                  jb @loop2
  199.                  mov eax,dword [esp+$24]
  200.                  inc esi
  201.     cmp esi,eax
  202.                  jb @loop1
  203. @loop11:
  204.                  add esp, 8
  205.     ret
  206. end;
  207.  
  208. procedure Tmain.fillmass;
  209.  asm
  210.   xor eax,eax
  211. @Label1:
  212.                  test al,1
  213.                  mov dword ptr ds:[eax*4+crcdata],eax
  214.                  je @Label2
  215.                  mov ecx,eax
  216.                  shr ecx,1
  217.                  xor ecx,$edb88320
  218.                  mov dword ptr ds:[eax*4+crcdata],ecx
  219.                  jmp @Label5
  220. @Label2:
  221.                  mov edx,eax
  222.          shr edx,1
  223.                  mov dword ptr ds:[eax*4+crcdata],edx
  224. @Label5:
  225.                  mov ecx,dword ptr ds:[eax*4+crcdata]
  226.                  test cl,1
  227.                  je @Label3
  228.                  shr ecx,1
  229.                  xor ecx,$edb88320
  230.                  jmp @Label4
  231. @Label3:
  232.                  shr ecx,1
  233. @Label4:
  234.                  test cl,1
  235.                  mov dword ptr ds:[eax*4+crcdata],ecx
  236.                  je @Label7
  237.                  shr ecx,1
  238.     xor ecx,$edb88320
  239.                  jmp @Label6
  240.  
  241. @Label7:
  242.     shr ecx,1
  243. @Label6:
  244.                  test cl,1
  245.                  mov dword ptr ds:[eax*4+crcdata],ecx
  246.                  je @Label9
  247.                  shr ecx,1
  248.     xor ecx,$edb88320
  249.                  jmp @Label8
  250.  
  251. @Label9:
  252.                 shr ecx,1
  253. @Label8:
  254.     test cl,1
  255.                  mov dword ptr ds:[eax*4+crcdata],ecx
  256.                  je @Label10
  257.                  shr ecx,1
  258.                  xor ecx,$edb88320
  259.                  jmp @Label11
  260. @Label10:
  261.     shr ecx,1
  262. @Label11:
  263.     test cl,1
  264.                  mov dword ptr ds:[eax*4+crcdata],ecx
  265.                  je @Label12
  266.                  shr ecx,1
  267.     xor ecx,$edb88320
  268.                  jmp @Label13
  269. @Label12:
  270.     shr ecx,1
  271. @Label13:
  272.                  test cl,1
  273.                  mov dword ptr ds:[eax*4+crcdata],ecx
  274.                  je @Label14
  275.     shr ecx,1
  276.     xor ecx,$edb88320
  277.                  jmp @Label15
  278. @Label14:
  279.     shr ecx,1
  280. @label15:
  281.     test cl,1
  282.                  mov dword ptr ds:[eax*4+crcdata],ecx
  283.                  je @Label16
  284.     shr ecx,1
  285.                  xor ecx,$edb88320
  286.                  jmp @Label17
  287. @Label16:
  288.                  shr ecx,1
  289. @Label17:
  290.                  mov dword ptr ds:[eax*4+crcdata],ecx
  291.     inc eax
  292.                  cmp eax,$ff
  293.                  jl @Label1
  294.  end;
  295.  
  296. procedure Tmain.gen(tip: integer);
  297. var i:integer;
  298. //   str:string;
  299. begin
  300.  for I := 0 to 251 do
  301.    crcdata[i]:=0;
  302.  for I := 0 to 511 do
  303.  recvbuf[i]:=char(0);
  304.  PDWORD(@recvbuf[0])^:=$000BEC61;
  305.  PDWORD(@recvbuf[$120])^:=tip;
  306.  PDWORD(@recvbuf[$148])^:=255;
  307. crc();
  308.  end;
  309.  
  310. end.

Вот код на сях
Code:
  1. void crypt1(const char* Mass, int Const1, int Const2)
  2. {
  3.    __asm
  4.    {
  5.                  pop edi
  6.                  pop esi
  7.                  pop ebx
  8.                  pop ebp
  9.  
  10.                  mov eax,dword [esp+0xc]
  11.                  sub esp,8
  12.                  push esi
  13.         xor esi,esi
  14.                  test eax,eax
  15.                  jbe loop11
  16.         push ebx
  17.                  mov ebx,dword [esp+0x14]
  18.                  push ebp
  19.         push edi
  20.                  lea esp,dword [esp]
  21.  
  22. loop1:
  23.  
  24.                  mov dword [esp+0x14],0
  25.                  mov eax,4
  26.                  lea ecx,dword [ecx]
  27.  
  28. loop2:
  29.  
  30.                  mov edx,dword [esp+0x20]
  31.                  mov cx,word [esp+0x14]
  32.         shr dx,cl
  33.                  test dl,1
  34.                  je loop4
  35.                  mov edx,dword [ebx+esi*4]
  36.                  lea ecx,dword [eax-4]
  37.         mov edi,3
  38.         shl edi,cl
  39.                  mov dword [esp+0x10],edx
  40.                  lea ecx,dword [eax-4]
  41.         and edx,edi
  42.         mov ebp,edx
  43.         shr ebp,cl
  44.                  cmp ebp,2
  45.                  je loop3
  46.                  cmp ebp,1
  47.                  jnz loop4
  48.  
  49. loop3:
  50.  
  51.                  mov ecx,dword [esp+0x10]
  52.         or ecx,edi
  53.         not edx
  54.         and ecx,edx
  55.                  mov dword [ebx+esi*4],ecx
  56.  
  57. loop4:
  58.  
  59.                  mov cl,byte [esp+0x14]
  60.                  mov edx,dword [esp+0x20]
  61.         inc cl
  62.         shr dx,cl
  63.         test dl,1
  64.                  je loop6
  65.                  mov edx,dword [ebx+esi*4]
  66.                  lea ecx,dword [eax-2]
  67.                  mov edi,3
  68.         shl edi,cl
  69.                  mov dword [esp+0x10],edx
  70.                  lea ecx,dword [eax-2]
  71.         and edx,edi
  72.                  mov ebp,edx
  73.         shr ebp,cl
  74.         cmp ebp,2
  75.                  je loop5
  76.                  cmp ebp,1
  77.                  jnz loop6
  78.  
  79. loop5:
  80.  
  81.                  mov ecx,dword [esp+0x10]
  82.         or ecx,edi
  83.         not edx
  84.         and ecx,edx
  85.                  mov dword [ebx+esi*4],ecx
  86.  
  87. loop6:
  88.  
  89.                  mov cl,byte [esp+0x14]
  90.                  mov edx,dword [esp+0x20]
  91.         add cl,2
  92.         shr dx,cl
  93.         test dl,1
  94.                  je loop8
  95.                  mov edx,dword [ebx+esi*4]
  96.         mov ecx,eax
  97.         mov edi,3
  98.         shl edi,cl
  99.                  mov dword [esp+0x10],edx
  100.                  and edx,edi
  101.         mov ebp,edx
  102.         shr ebp,cl
  103.         cmp ebp,2
  104.                  je loop7
  105.         cmp ebp,1
  106.                  jnz loop8
  107.  
  108. loop7:
  109.  
  110.                  mov ecx,dword [esp+0x10]
  111.         or ecx,edi
  112.         not edx
  113.         and ecx,edx
  114.                  mov dword [ebx+esi*4],ecx
  115.  
  116. loop8:
  117.  
  118.                  mov cl,byte [esp+0x14]
  119.                  mov edx,dword [esp+0x20]
  120.         add cl,3
  121.         shr dx,cl
  122.                  test dl,1
  123.                  je loop10
  124.                  mov edx,dword [ebx+esi*4]
  125.                  lea ecx,dword [eax+2]
  126.         mov edi,3
  127.         shl edi,cl
  128.                  mov dword [esp+0x10],edx
  129.         and edx,edi
  130.         mov ebp,edx
  131.         shr ebp,cl
  132.                  cmp ebp,2
  133.                  je loop9
  134.                  cmp ebp,1
  135.                  jnz loop10
  136.  
  137. loop9:
  138.  
  139.                  mov ecx,dword [esp+0x10]
  140.         or ecx,edi
  141.         not edx
  142.         and ecx,edx
  143.                  mov dword [ebx+esi*4],ecx
  144.  
  145. loop10:
  146.  
  147.                  mov edi,dword [esp+0x14]
  148.         add edi,4
  149.         add eax,8
  150.                  cmp eax,0x24
  151.                  mov dword [esp+0x14],edi
  152.                  jb loop2
  153.                  mov eax,dword [esp+0x24]
  154.                  inc esi
  155.         cmp esi,eax
  156.                  jb loop1
  157.                  pop edi
  158.         pop ebp
  159.                  pop ebx
  160.  
  161. loop11:
  162.                  pop esi
  163.                  add esp, 8
  164.                  ret
  165.    }
  166. }




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 13 октября 2009 09:38
· Личное сообщение · #17

Может просто поднять приоритет и забыть про оптимизацию, юзермод ведь




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 13 октября 2009 12:20
· Личное сообщение · #18

3uM6a6Ba пишет:
все-равно болт!


в Сях передача параметров через стек осуществляется при их помещении по списку справа на лево, а в Дельфях (аля Паскаль) наоборот слева на право. А вы используете одни и теже с Си смещения относительно ESP для доступа к ним.

В Си удалением параметров из стека занимается вызывающий код, а в Паскале сама функа должна почистить стек (ret $C).

В Си чтобы не изощряться с попами впереди функи нужно в обявление добавить __declspec(naked) - голый писаный код.

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 13 октября 2009 18:45
· Личное сообщение · #19

OKOB пишет:
в Сях передача параметров через стек осуществляется при их помещении по списку справа на лево, а в Дельфях (аля Паскаль) наоборот слева на право.

Да и к тому же в делфях по умолчанию первые параметры передаются через регистры (fastcall).

3uM6a6Ba пишет:
Вот что сделал все-равно болт!

Сорри, писал что надо объявлять как stdcall, но раз на сях работает и стоит просто ret, то нужно cdecl.
Т.е. после procedure Tmain.crypt(.....); пиши cdecl;
И еще - в сях при передаче mass передается просто указатель, в дельфях (в том модуле, что ты запостил) передается указатель на первый элемент массива и длина массива за вычетом единицы (т.е. в стек кладется не 0x0C, а 0x10). Поэтому передавай mass не как array of char, а как указатель, например PAnsiChar.



Ранг: 11.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 октября 2009 22:43
· Личное сообщение · #20

Всем пасиб




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 14 октября 2009 07:34
· Личное сообщение · #21

В дополнение добавлю: надо учитывать еще и особенности ООП - т.е. если метод crypt1 является методом класса, то указатель на сам объект (Self) передается в метод через какой-либо регистр. Поэтому перед выполнением асмового кода надо обязательно сохранять в стеке все остальные регистры (и в конце восстанавливать их из стека), которые портит код.


 eXeL@B —› Программирование —› Подскажите что не так делаю Delphi +asm
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати