Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   ASM y Microcontroladores (https://www.clubdelphi.com/foros/forumdisplay.php?f=44)
-   -   Significado de sentencias en ensamblador (https://www.clubdelphi.com/foros/showthread.php?t=71372)

LuisAlf:: 15-12-2010 19:36:11

Significado de sentencias en ensamblador
 
Hola a todos..

Hace tiempo que estuve viendo un foro pasado que habla sobre el ensamblador en Delphi..
Por cuestiones de no poder abrir el foro pasado para poner mis dudas sobre codigo que no entiendo, habro este para tal objetivo..

Miren en el post encontre este codigo en ensamblador:

Código Delphi [-]
program Ejecutor;
uses  Windows;
const  WM_CHAR= $0102; 
var   miHandle : DWORD;   
data : string ;    
App :string ='Notepad.exe';    
Wndclass : string = 'Notepad';    
Childclass : string= 'Edit';
begin
     data := ' Estamos probando como funciona el assembler'+ #13#10+    
        'en Delphi y como no tenemos ni idea, no sabemos'+#13#10+   
         'que sucederà .'+#13#10+        
                   'Bueno, no tenemos ni idea de Delphi,'+#13#10+            
          'en ensamblador , algo si sabemos ,es el primer len-'+#13#10+            
'guaje de programación  que nos pusimos a intentar '+#13#10+           
 'aprender o debí escribir aprehender............'+#13#10+                  
  '¿ End ?' ;    
asm      
pushad      
push SW_SHOW      
push dword ptr [App ]      
call WinExec      
push 0      
push dword ptr [Wndclass]      
call FindWindow      
push  0      
push Childclass      
push 0      
push eax      
call FindWindowEx      
mov [miHandle], eax      
mov edx, data   
@@eti1:      
xor eax, eax      
mov al ,byte [edx]      
or al, al      
jz @@eti2      
push edx      
push 0      
push eax      
push WM_CHAR      
push [miHandle]      
call SendMessage      
push 100      
call Sleep      
pop edx      
inc edx      
jmp @@eti1    
@@eti2:       
push 0       
call ExitProcess       
popad    
end;
end.

Posteriormente viene en el post el equivalente codigo pero en codigo Delphi..

Código Delphi [-]
uses Windows, Messages; 
var hWnd, Pos: Cardinal; 
Str: PChar = ' Estamos probando como funciona el assembler'#13+              
    'en Delphi y como no tenemos ni idea, no sabemos'#13+              
    'que sucederà .'#13+              
    'Bueno, no tenemos ni idea de Delphi,'#13+              
    'en ensamblador , algo si sabemos ,es el primer len-'#13+              
    'guaje de programación  que nos pusimos a intentar '#13+              
    'aprender o debí escribir aprehender............'#13+              
    '¿ End ?';

begin 

Pos := 0; 

WinExec('notepad.exe', SW_SHOW); 

hWnd := FindWindowEx(FindWindow('Notepad', nil), 0, 'Edit', nil); 

  while Str[Pos] <> #0 do  begin   
    SendMessage(hWnd, WM_CHAR, Integer(Str[Pos]), 0);   
    Sleep(100);   
    Inc(Pos);  
  end;

end.

Lo que pasa es que tengo ciertas dudas con algunas sentencias como:

1. "Pushad".
2. push dword ptr [App ]??
3. push 0
4. mov [miHandle], eax:
Mi duda aqui es: si el registro eax se pasa al la variable manejado o como??
5. xor eax, eax: esta sentencia borra el registro "eax"?
6. mov al ,byte [edx]: mueve un caracter al registro "al"?
7. or al, al??
8. push edx
push 0
push eax: para que se utilizan estos push??
9. push 100: para que es?...

Bueno esas son mis dudas..

Espero que alguien pueda responder a mis dudas y de antemano disculpen mi ignorancia...:(

Gracias..

ElKurgan 16-12-2010 08:42:46

Cita:

Empezado por LuisAlf:: (Mensaje 385061)
Lo que pasa es que tengo ciertas dudas con algunas sentencias como:
1. "Pushad".
2. push dword ptr [App ]??
3. push 0
4. mov [miHandle], eax:
Mi duda aqui es: si el registro eax se pasa al la variable manejado o como??
5. xor eax, eax: esta sentencia borra el registro "eax"?
6. mov al ,byte [edx]: mueve un caracter al registro "al"?
7. or al, al??
8. push edx
push 0
push eax: para que se utilizan estos push??
9. push 100: para que es?...

1. pushad - Pone todos los registros en la pila para guardar el estado y recuperarlos en cualquier momento. Suelen usarlo los programas que empaquetan o cifran el ejecutable

Las sentencias push suelen poner valores en la pila antes de llamar a funciones; serían el equivalente al paso de parámetros a una función. Esto sirve para todos los push posteriores:

2. push dword ptr [App ] - Pasa a la pila el valor de la variable App; el indicador ptr se usa en compiladores de ensamblador para Win32; no se usa, por ejemplo, en linux, y se acompaña del tipo de parámetro, cuando hay dudas de su valor (App puede valer, por ejemplo, 2, y no sabe si pasar al registro 2, 0002 ó 00000002; eso se le indica con el tipo, en este caso, dword)

3. push 0 - Pasa a la pila el valor 0 como parámetro

4. mov [miHandle], eax - Pasa el valor de la variable al registro eax

5. xor eax, eax - Es una forma elegante de poner a cero el valor de un registro

6. mov al ,byte [edx] - mueve el contenido de "al" a edx; como es el doble de grande, le indica el tipo de lo que tiene que guardar

7. or al, al - Cuando se hace esto suele ser para ver si el acumulador tiene un valor concreto. Antiguamente se usaba mucho para comprobar si una función devolvía un cero, porque ocupaba un sólo ciclo de reloj. Actualmente hay llamadas que ocupan lo mismo (un ciclo) y se usan tanto como OR (CMP, TEST).

8. push edx
push 0
push eax - Paso de parámetros a la pila antes de llamada a función

9. push 100 - Otro paso de parámetros. Le pasa el valor 100 a "sleep"

Creo que por ahí van los tiros. La verdad es que tengo bastante olvidado el TASM, asi que si he metido la pata en algo, lo siento, y espero que alguien más enterado te pueda sacar de dudas.

Saludos

LuisAlf:: 17-12-2010 00:12:52

Cita:

Empezado por ElKurgan (Mensaje 385130)
Creo que por ahí van los tiros. La verdad es que tengo bastante olvidado el TASM, asi que si he metido la pata en algo, lo siento, y espero que alguien más enterado te pueda sacar de dudas.
Saludos

Hola! y gracias por tu ayuda!
La verdad que ciertas cosas me las suponia!, pero con tu explicación me quedan muy claras ciertas sentencias!.:rolleyes:

Bueno nada más una cosa...
En las sentencias como:
mov [miHandle], eax
y....
mov al ,byte [edx]

No sera al reves a como tu lo explicas, en este caso??
es decir que el valor de la derecha se mueva al valor de la izquieda??:confused:

ElKurgan 17-12-2010 17:37:49

Pues si, tienes razón... Ya te dije que estaba algo oxidado ;)

Saludos


La franja horaria es GMT +2. Ahora son las 15:03:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi