Estimado,
O sea que luego del call, cuando retorna y quita la dirección del stack, al hacer POP SI esta metiendo lo que había en DI en SI? Lo hice a lapiz y papel y no entiendo porque se hace POP SI si lo ultimo que hay en el stack a esa altura es DI a mi entender.
Esto es porque lo que se está pasando es el resultado de la función. El resultado estaba en DI al momento de pushearlo (por eso PUSH DI), pero cuando se recibe en la línea siguiente al CALL, no hay por qué obtenerlo en el mismo registro. POP SI toma lo que está en el tope del stack y lo coloca en SI, pero lo que está en el tope del stack es simplemente un valor, no está 'ligado' a algún registro. Distinto es el caso de los PUSH y POP para guardar el contexto, en ese caso, al hacer PUSH AX, PUSH BX (ejemplo) para preservar los valores de los registros AX y BX, eventualmente se realiza POP BX, POP AX, en ese orden y con esos registros específicos, para recuperar en cada registro exactamente lo que tenían.
Otra duda que tengo es, cuando trabajamos con estructuras como estas donde tenemos punteros a chars y a siguientes, podemos asumir que si [SI] tiene el contenido del primer char de un string, [SI+1] va a tener el segundo char y asi sucesivamente? Consulto por la parte del codigo donde se hace
Sí, los arreglos se disponen en memoria de forma contigua y por lo tanto el "[SI + 1]" va a tener el siguiente carácter
Saludos,
Federico