¿Como puedo hacer while o for en FASM?
Esto es assembly puro, ejecuta el codigo del bucle (inc eax) un numero X de veces (de acuerdo al valor de ECX):
mov ecx, 5
xor eax, eax
bucle:
inc eax
loop bucle
http://pdos.csail.mit.edu/6.828/2006/readings/i386/LOOP.htm
Tambien podes hacerlo con cmp's y jmp's.
mov ecx, 5
xor eax, eax
bucle:
inc eax
dec ecx
cmp ecx, 0
jne bucle
Tambien podrias hacer lo contrario, iniciando el contador a 0, incrementandolo en cada pasada y comprobando si es igual (o mayor como en el ejemplo siguiente) al limite:
xor ecx, ecx
xor eax, eax
bucle:
inc eax
add ecx, 2
cmp ecx, 9
jna bucle
Este bucle se ejecutara mientras el resultado devuelto por func sea diferente de 0:
bucle:
call func
cmp eax, 0
jne bucle
Podes hacer uso de JCC (http://pdos.csail.mit.edu/6.828/2005/readings/i386/Jcc.htm) tambien.
El primer código cuando eax sea igual a 5 se para?
Cita de: Erik# en 27 Agosto 2009, 14:17 PM
El primer código cuando eax sea igual a 5 se para?
No, la mejor manera de que lo comprendas es depurandolo pero como dije al principio y dice tambien en el enlace que deje sobre loop:
... ejecuta el codigo del bucle (inc eax) un
numero X de veces (de acuerdo al valor de
ECX).
La C de ECX viene de COUNT, por eso la instruccion loop del microprocesador usa ese registro, el inc eax es unicamente el codigo del bucle en si mismo, es lo que hace, ahi podias poner cualquier cosa.
Gracias idol, he probado hacer algo así:
format pe gui
entry start
include 'win32ax.inc'
.data
nUM dd ?
nSum db 2 dup(0)
.code
start:
mov ecx, 5
xor eax, eax
bucle:
inc eax
invoke wsprintfA, nSum,'%d',eax
add esp,12
invoke MessageBoxA, 0,nSum,nSum,0
loop bucle
ret
section '.idata' import data readable
library user32,'user32.dll'
import user32,MessageBoxA,'MessageBoxA',wsprintfA,'wsprintfA'
Pero se me queda parado en el 2
Cualquier funcion que llames puede afectar a los registros que no se preservan, muy especialmente eax que ademas es el valor de retorno de una funcion:
bucle:
push ecx
inc eax
push eax
invoke wsprintfA, nSum,'%d',eax
add esp,12
invoke MessageBoxA, 0,nSum,nSum,0
pop eax
pop ecx
loop bucle
¿Por que push eax,ecx y pop eax,ecx? El POP y el PUSH es algo que he leido en muchos manuales, wikipedia... y no logro acabar de entenderlo :S.
¿Para que sirven realmente pop y push? no quiero una definición wikipedia, porque
PUSH mete un DWORD en la pila
POP al contrario que PUSH saca un DWORD de la pila.
(Frases extraidas del taller de e0n)
Sirven para eso mismo ... en este codigo sirven para guardar el valor que tengan en la pila (push), ejecutar las funciones que cambian el valor de esos registros y posteriormente restaurarlos (pop). DEPURA tu codigo y despues el codigo que funciona y vas a verlo mucho mas claramente.
PD. El orden que mencionaste no es correcto, primero se empuja ecx, despues eax y por eso mismo primero se saca eax y despues ecx.
Cita de: Eternal Idol en 27 Agosto 2009, 14:56 PM
Sirven para eso mismo ... en este codigo sirven para guardar el valor que tengan en la pila (push), ejecutar las funciones que cambian el valor de esos registros y posteriormente restaurarlos (pop). DEPURA tu codigo y despues el codigo que funciona y vas a verlo mucho mas claramente.
Y cuando debo usar push (a parte de cuando invoque una función...) y cuando pop?
Cita de: Erik# en 27 Agosto 2009, 15:01 PMY cuando debo usar push (a parte de cuando invoque una función...) y cuando pop?
Cuando quieras empujar y sacar algo de la pila :D Cuando uses una convencion de llamada que pase los parametros en la pila como C y stdcall por ejemplo.
Cita de: Eternal Idol en 27 Agosto 2009, 15:02 PM
Cita de: Erik# en 27 Agosto 2009, 15:01 PMY cuando debo usar push (a parte de cuando invoque una función...) y cuando pop?
Cuando quieras empujar y sacar algo de la pila :D Cuando uses una convencion de llamada que pase los parametros en la pila como C y stdcall por ejemplo.
Gracias eternal, eres un dios del bajo nivel xD
De nadas ::)