Abril Negro 2008: Taller de ASM

Iniciado por ~~, 13 Abril 2008, 16:52 PM

0 Miembros y 1 Visitante están viendo este tema.

elmeister

muchas gracias, ahora ha quedado claro, aunque debería estar puesto eso en el post principal para evitar dudas de más gente.

Saludos

elmeister

te dejo los ejercicios hechos por MP, no se si el 4º (el del IF) está bien, pero lo demás supongo que si

elmeister

Cita de: E0N en 22 Abril 2008, 23:04 PM
Mejor pega el source en el post  y asi se comentan dudas y eso ;) Por q es q como me los tenga q dar a mi todo el mundo me puedo aburrir a corregirlos xD

Salu2

para que no diga nadie que le fastidié los ejercicios, posteo aquí el código por petición de E0N:

Ejercicio 1:

Código (asm) [Seleccionar]

include 'H:\archivos de programa\fasm\include\win32ax.inc'

.code
start:

mov eax, 12  ;Puede ser cualquier valor, yo les he dado estos porque me apetecía
mov ebx, 8    ;Usar esos numeros
add eax, ebx

.end start


ejercicio 2

Código (asm) [Seleccionar]
include 'H:\archivos de programa\fasm\include\win32ax.inc'
.data
miByte db  ?

.code

start:

mov [miByte], 8
mov al, 7
add al, 8
add al, 5
add al, 2
add al, 9
add al, 1
add al, 0
add al, 3
div [miByte]     ; el resultado aparecerá en AL y el resto en AH


.end start


ejercicio 3

Código (asm) [Seleccionar]
include 'H:\archivos de programa\fasm\include\win32ax.inc'

.code

start:

push 1
pop eax
push 2
pop ebx
push 3
pop ecx
push 4
pop edx
push 5
pop edi
push 6
pop esi


.end start


Ejercicio 4 (no se si lo tengo bien o no)

Código (asm) [Seleccionar]

include 'H:\Archivos de programa\FASM\INCLUDE\WIN32AX.inc'
.code
start:

mov eax, 23
mov ebx, 39
cmp eax,ebx
je iguales
jne distintos

iguales:

invoke MessageBox, 0, 'eax y ebx son iguales', '', 0
invoke ExitProcess, 0

distintos:

invoke MessageBox, 0, 'eax y ebx son distintos', '', 0
invoke ExitProcess, 0

.end start


Ejercicio 5: (se que es así, pero no se si he elegido bien los saltos, creo que si)

Código (asm) [Seleccionar]
include 'H:\archivos de programa\fasm\include\win32ax.inc'

.code

start:

mov eax, 7
mov ebx, 1
add eax, ebx
cmp eax, 5
JBE salir
JG mensaje

mensaje:

invoke MessageBox, 0, 'Mayor que 5', '', 0

salir:

invoke ExitProcess, 0

.end start


Aquí podeis descargar los códigos fuente y los ejecutables compilados, lo he resubido porque vi que el código del primer ejercicio estaba en balco a la hora de postearlo:

http://www.megaupload.com/?d=Y1O3BY3K

SheKeL_C$

Creo que estan todos bien...los he mirado por encima. Tan solo decir que para simplificar un poco el codigo en el ejecicio 4 yo haria asi

Código (asm) [Seleccionar]
mov eax, 23
mov ebx, 39
cmp eax,ebx
jne distintos

invoke MessageBox, 0, 'eax y ebx son iguales', '', 0
invoke ExitProcess, 0

distintos:

invoke MessageBox, 0, 'eax y ebx son distintos', '', 0
invoke ExitProcess,0


Pero sabiendo que se trata de utilizar muchos saltos... esta bien como esta  ;)

Rozor

Yo usaria JE o JNE para hacer los saltos despues de un CMP o como dijo SheKel es mas correcto si es JNE que salte y si es JE no hacerle el salto si no que las siguientes instrucciones sea el si pasa.

out in the streets they call it murder....

elmeister

Cita de: Rozor en 23 Abril 2008, 17:14 PM
Yo usaria JE o JNE para hacer los saltos despues de un CMP o como dijo SheKel es mas correcto si es JNE que salte y si es JE no hacerle el salto si no que las siguientes instrucciones sea el si pasa.

no pasa nada, ya está hecho y tambien es correcto no?, pues ya está, no le demos más vueltas al asunto

krackwar

Cita de: E0N en 19 Abril 2008, 15:00 PM
Pues no se que mas quieres que profundice, son instruccioes básicas y viene un ejemplillo de cada una. Lo mejor es que hagas una prueba de cada una y mires con un debugger (el olly mismo q es el que yo he explicado o con los que a dicho Eternal Idol) para ver bien como funcionan. Una vez las entiendas intenta hacer los ejercicios y si te salen es q ya las tienes casi dominadas :P

Salu2 y si no entiendes alguna pregunta
Despues de leer 3 veces XD pude hacer los ejercicios .
una pregunta como se puede hacer que si la respuesta de un mensage es "si" hacer tal cosa i si la respuesta es "no" hacer otra cosa 
Mi blog
Bienvenido krackwar, actualmente tu puntuación es de 38 puntos y tu rango es Veteran.
El pollo número 1, es decir yo, (krackwar), adoro a Shaddy como a un dios.

~~

Pues lo comparas igual que si fuese un número pero con la cadena, piensa que comparas bytes, solo eso, como ya puse lo q hace cmp en realidad es esto:

CitarCMP Valor1, Valor2

CMP compara dos valores. En realidad lo que hace esta instrucción es restar el Valor2 del Valor1 y activar el Flag correspondiente a el resultado. Por ejemplo si son iguales, si uno es mayor que el otro... (un Flag es como un registro pero que solo almacena 1 bit).
Usaremos esta instrucción para los saltos condicionales que se explicarán a continuación.

Seria asi:

Código (asm) [Seleccionar]
mov eax, 'SI'
cmp eax, 'SI'
jne NO
        invoke MessageBox, 0, 'Es si', '', 0
NO:
invoke ExitProcess


Claro, que en eax tendrías que obtener el valor pidiendosolo al usuario, ya sea creando un formulario, una aplicación de consola o como tu quieras ;)

Salu3

elmeister

#58
si te refieres al típico mensaje con los botones de si y no usa este (lo he sacado del código al que le quería meter el icono y lo he retocado un poco)

Código (asm) [Seleccionar]

include 'H:\archivos de programa\fasm\include\win32ax.inc'  ;He usado H: porque es mi unidad de disco donde tengo el FASM, tu usa la tuya

.code
start:

invoke   MessageBoxA,0,'aqui va el mensaje','y aqui el titulo de la ventanita',MB_YESNO
cmp eax,IDYES
jne no

invoke   MessageBoxA,0,'le has dado al si','SI',0
invoke   ExitProcess

no:

invoke   MessageBoxA,0,'le has dado al no','NO',0
invoke   ExitProcess

.end start                 

krackwar

muchas gracias me funciono  ;D,por cierto eso de MB_YESNO sirve = como en VB?
s4lu2!
Mi blog
Bienvenido krackwar, actualmente tu puntuación es de 38 puntos y tu rango es Veteran.
El pollo número 1, es decir yo, (krackwar), adoro a Shaddy como a un dios.