web-dev-qa-db-fra.com

Boucles While, Do While, For en langage assembleur (emu8086)

Je veux convertir des boucles simples dans des langages de haut niveau en langage d'assemblage (pour emu8086), disons que j'ai ce code:

 for(int x = 0; x<=3; x++)
 {
  //Do something!
 }

ou

 int x=1;
 do{
 //Do something!
 }
 while(x==1)

ou

 while(x==1){
 //Do something
 }

Comment faire cela dans emu8086?

17
Glynn Bacanto

Pour les boucles:

Boucle For en C:

for(int x = 0; x<=3; x++)
{
    //Do something!
}

La même boucle dans l'assembleur 8086:

        xor cx,cx   ; cx-register is the counter, set to 0
loop1   nop         ; Whatever you wanna do goes here, should not change cx
        inc cx      ; Increment
        cmp cx,3    ; Compare cx to the limit
        jle loop1   ; Loop while less or equal

C'est la boucle si vous devez accéder à votre index (cx). Si vous voulez juste quelque chose 0-3 = 4 fois mais que vous n'avez pas besoin de l'index, ce serait plus facile:

        mov cx,4    ; 4 iterations
loop1   nop         ; Whatever you wanna do goes here, should not change cx
        loop loop1  ; loop instruction decrements cx and jumps to label if not 0

Si vous voulez simplement exécuter une instruction très simple un nombre constant de fois, vous pouvez également utiliser une directive assembleur qui ne fera que renforcer cette instruction

times 4 nop

Boucles à faire

Do-while-loop en C:

int x=1;
do{
    //Do something!
}
while(x==1)

La même boucle dans l'assembleur:

        mov ax,1
loop1   nop         ; Whatever you wanna do goes here
        cmp ax,1    ; Check wether cx is 1
        je loop1    ; And loop if equal

Boucles while

Boucle while en C:

while(x==1){
    //Do something
}

La même boucle dans l'assembleur:

        jmp loop1   ; Jump to condition first
cloop1  nop         ; Execute the content of the loop
loop1   cmp ax,1    ; Check the condition
        je cloop1   ; Jump to content of the loop if met

Pour les boucles for, vous devez prendre le registre cx car il est à peu près standard. Pour les autres conditions de boucle, vous pouvez prendre un registre de votre choix. Bien sûr, remplacez l'instruction de non-opération par toutes les instructions que vous souhaitez exécuter dans la boucle.

39
Max Benson