x86 asm: помощь с разобранным кодом - PullRequest
2 голосов
/ 12 июня 2011

Может кто-нибудь объяснить мне следующий код asm, пожалуйста?Что оно делает?Я уже прокомментировал это немного ...
РЕДАКТИРОВАТЬ: C ++, скомпилировано с MS Visual C ++ 2008 Express Eddition -> пересобрать

.text:39552AF5    pop     ecx
.text:39552AF6    push    eax             ; void *
.text:39552AF7    lea     eax, [ebp+procedureVariable_C] ; get a proc variable from stack to eax?
.text:39552AFA    call    sub_39501565 ; call procedure with arguments: eax(void) and the lea result?
.text:39552AFF    mov     ecx, dword_395D0A44 ; dword_395D0A44("official") char gets moved into ecx
.text:39552B05    mov     eax, ebx ; ?
.text:39552B07    call    sub_39572981 ; ? no arguments?

.text:39501565 ; int __stdcall sub_39501565(void *)<br> .text:39501565 sub_39501565 proc near ; CODE XREF: sub_39501423+1Cp<br> .text:39501565 ; sub_39501803+1Cp ...<br> .text:39501565<br> .text:39501565 arg_0 = dword ptr 4<br> .text:39501565<br> .text:39501565 cmp [esp+arg_0], 0<br> .text:3950156A push edi<br> .text:3950156B mov edi, eax<br> .text:3950156D jnz short loc_39501573<br> .text:3950156F xor eax, eax<br> .text:39501571 jmp short loc_39501583<br> .text:39501573 ; ---------------------------------------------------------------------------<br> .text:39501573<br> .text:39501573 loc_39501573: ; CODE XREF: sub_39501565+8j<br> .text:39501573 mov eax, [esp+4+arg_0]<br> .text:39501577 lea edx, [eax+1]<br> .text:3950157A<br> .text:3950157A loc_3950157A: ; CODE XREF: sub_39501565+1Aj<br> .text:3950157A mov cl, [eax]<br> .text:3950157C inc eax<br> .text:3950157D test cl, cl<br> .text:3950157F jnz short loc_3950157A<br> .text:39501581 sub eax, edx<br> .text:39501583<br> .text:39501583 loc_39501583: ; CODE XREF: sub_39501565+Cj<br> .text:39501583 push eax ; int<br> .text:39501584 push [esp+8+arg_0] ; void *<br> .text:39501588 call sub_39501524<br> .text:3950158D mov eax, edi<br> .text:3950158F pop edi<br> .text:39501590 retn 4<br> .text:39501590 sub_39501565 endp

Ответы [ 3 ]

1 голос
/ 12 июня 2011

Эта часть

.text:39501573
.text:39501573 loc_39501573: ; CODE XREF: sub_39501565+8j
.text:39501573 mov eax, [esp+4+arg_0]
.text:39501577 lea edx, [eax+1]
.text:3950157A
.text:3950157A loc_3950157A: ; CODE XREF: sub_39501565+1Aj
.text:3950157A mov cl, [eax]
.text:3950157C inc eax
.text:3950157D test cl, cl
.text:3950157F jnz short loc_3950157A
.text:39501581 sub eax, edx

выглядит так, как будто она сканирует нулевой байт и вычисляет end - start + 1, где start + 1 происходит от edx.

Это то, что strlen сделал бы!

Здесь есть какая-то магия?!

0 голосов
/ 12 июня 2011

Что вы хотите узнать от ТАК, чего вы еще не знаете? Это пара вызовов функций. Первый передает локальный параметр по ссылке в EAX, второй получает EAX в качестве параметра, возможно, результат первого вызова или, возможно, только то, что было передано в этот блок в EBX.

Мы не знаем, какие соглашения о вызовах используются, является ли этот ассемблер дизассемблированным выходом компилятора или «человеческим» кодированием, без контекста, без понятия о том, что функции делают или возвращают. Мы не совсем в состоянии помочь.

В этом коде нет ничего необычного. В чем проблема?

Rgds, Martin

0 голосов
/ 12 июня 2011

Леа ничего не разыменовывает.Он просто выполняет арифметику с регистрами во втором параметре и сохраняет результат в первом параметре.

lea     eax, [ebp+procedureVariable_C];

Предполагая, что procedureVariable_C является постоянным смещением, он добавляет это смещение для вычисления указателя на соответствующую переменную..

...