2015-02-26 1 views
1

Probablement une question stupide, mais c'est mon premier projet dans ma classe d'organisation de machine et j'ai quelques problèmes. Le code ci-dessous est destiné à afficher '*' au milieu de l'écran de haut en bas. La ligne de code qui est wont assembler:
MOV ES: [ numLoops * 80 * 2 + (40 * 2) ], BYTE PTR '*'Obtention de la valeur d'une variable dans le langage d'assemblage

Je comprends pourquoi cela ne réunirons, mais je ne sais pas quoi mettre en place des numLoops afin d'obtenir sa valeur de sorte que chaque fois que la ligne du code est exécuté, il monte d'une ligne que numLoops est décrémenté. Tout conseil serait grandement apprécié, merci.

MyData SEGMENT 

    numLoops DB 25 

MyData ENDS  

;------------------------------------------------------------------------------- 
MyCode SEGMENT 

     ASSUME CS:MyCode, DS:MyData 

MainProg PROC     

    MOV  AX, MyData    
    MOV  DS, AX     
    MOV  AX, 0B800h   
    MOV  ES, AX 

    loop25: 

     CALL displayChar 

     DEC numLoops     
     CMP numLoops, 0 
    JNE loop25    ;if not equal to 0, numLoops - 1 and repeat 

    MOV  AH, 4Ch     
    INT  21h     

MainProg ENDP 

displayChar PROC 

    MOV  ES: [ numLoops * 80 * 2 + (40 * 2) ], BYTE PTR '*' 

    RET 
displayChar ENDP     

MyCode ENDS 

Répondre

1

Utilisez un registre pour calculer numLoops * 80 * 2:

mov bx,[numLoops] 
    imul bx,bx,160 
    mov byte ptr es:[bx + 40*2],'*' ; note that byte ptr goes before the memory 
            ; operand, not the immediate operand. 

Il existe des moyens plus efficaces de le faire (par exemple, commencer avec 25 * 160 dans un registre et juste soustrayez 160 de celui-ci lors de chaque itération) , mais cela devrait suffire si vous voulez juste quelque chose qui fonctionne. N'essayez pas de modifier la mémoire constante (comme c'était le cas dans la question originale).

+0

Cela a travaillé merci – BCRwar1

1

Le nombre de boucles doit être conservé dans un registre et non dans des données constantes. Donc, vous devriez avoir quelque chose comme:

MOV CX, 25  ; number of times to loop 
[do math on CX and put in DX] 
MOV ES:DX, BYTE PTR '*' 

En règle générale, vous devriez minimiser l'utilisation de segments. En raison des ordinateurs modernes ayant une grande quantité de mémoire, la plupart des langages d'assemblage utilisent maintenant le modèle "plat" dans lequel les segments ne sont pas utilisés, sauf à des fins spécialisées.