Hola, una pregunta, que es la n cuando se hace mov AX, [BP + n]? por ejemplo.
He visto mov AX, [BP +4] y no estoy seguro de que es lo que hace. Es que se esta moviendo 4 lugares desde donde esta BP hacia atraz?
Muchas gracias!
Hola, una pregunta, que es la n cuando se hace mov AX, [BP + n]? por ejemplo.
He visto mov AX, [BP +4] y no estoy seguro de que es lo que hace. Es que se esta moviendo 4 lugares desde donde esta BP hacia atraz?
Muchas gracias!
Normalmente en los ejercicios de recursión que los parametros vienen en stack , el resultado debe ir en el stack y hay que conservar los registros se usa BP para acceder a los elementos del Stack (como memoria), en vez de push y pop.
Por ej:
Suponete esta pila:
* IP * <-- SP
* param2 *
* param1 *
* ////////// *
* ////////// *
* * * * * * **
Si te fijas siempre se hace lo siguiente:
Push Bp
mov Bp, Sp
teniendo el resultado:
* BP * <-- BP
* IP *
* param2 *
* param1 *
* ////////// *
* ////////// *
* * * * * * **
Si te fijas como cada elemento del stack ocupa 2 bytes, hay que avanzar de a 2. (se suma porque el stack crece al reves)
BP <- [BP]
Ip <- [BP + 2]
param2 <- [BP + 4]
param1 <- [BP + 6]
Entonces suponete que tenes que comparar el param1 con 1 (por poner un ejemplo).
podes o pasarlo a un registro
mov AX, [BP + 6]
cmp AX, 1
o compararar directamente
cmp word ptr [BP + 6] , 1 (el word ptr, es porque el parametro sabes que ocupa 2 bytes en el stack)
Muchas gracias Anthony!
Una pregunta más, como me doy cuenta cuando un elemento en el stack ocupa un byte o cuando ocupa dos bytes?
Gracias de nuevo!
Push y Pop solo permiten registros de 16 bits (2 bytes) o Palabras de memoria (2 bytes), por tanto todo lo que haya en el stack, va a ocupar 2 bytes.
Buenisimo! muchas gracias!