es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MASM32 (Lib: Irvine32) Comportamiento extraño de variables

El problema es que la declaración if es verdadera varias veces, por lo que la variable “iDATA” vuelve a ser 100, pero al mismo tiempo, cuando imprimo la variable después de la declaración if, no dice que sea 100 y solo aumenta de 0 a x, como se esperaría.

.data
iDATA DWORD 0

.code

main PROC
    loop0:
        mov eax, iDATA
        .if eax == 100
            call WriteInt
        .endif
        add iDATA, 1
    jmp loop0
main ENDP

INVOKE ExitProcess, 0
END main

output: +100+100+100+100+100+100+100+100…

Por favor explícame cuál es mi error.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que la función WriteInt se llama cada vez que la declaración if es verdadera, es decir, cuando iDATA es igual a 100. Una vez que iDATA es igual a 100, continúa incrementándose y la declaración if sigue siendo verdadera, lo que hace que WriteInt sea llamada múltiples veces con el mismo valor (100) cada vez.

    Sin embargo, la razón por la cual la variable iDATA no parece cambiar después de que llega a 100, es porque la función WriteInt no cambia el valor de iDATA. El valor de iDATA sigue incrementándose a pesar de llamar repetidamente a WriteInt.

    Para solucionar este problema, puedes establecer una variable de indicador para indicar que WriteInt ya ha sido llamada para un valor dado de iDATA, y solo llamar a WriteInt si el indicador no ha sido establecido.

    Aquí tienes un ejemplo de cómo podrías modificar el código para lograr esto:

    .data
    iDATA DWORD 0
    iPrintedFlag DWORD 0
    
    .code
    
    main PROC
        loop0:
            mov eax, iDATA
            .if eax == 100 && iPrintedFlag == 0
                call WriteInt
                mov iPrintedFlag, 1 ; establecer indicador para indicar que el valor ha sido impreso
            .endif
            add iDATA, 1
            jmp loop0
        main ENDP
    
        INVOKE ExitProcess, 0
    END main
    

    Esto asegurará que WriteInt solo se llame una vez para cada valor de iDATA.

Comments are closed.