web-dev-qa-db-ja.com

While、Do While、アセンブリ言語のforループ(emu8086)

高レベル言語の単純なループをアセンブリ言語(emu8086用)に変換したいのですが、次のコードがあります。

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

または

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

または

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

Emu8086でこれを行うにはどうすればよいですか?

17
Glynn Bacanto

Forループ:

Cのforループ:

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

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

これは、インデックス(cx)にアクセスする必要がある場合のループです。 0-3 = 4倍にしたいが、インデックスが必要ない場合、これは簡単です。

        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

非常に単純な命令を一定の回数だけ実行したい場合は、その命令をハードコアするアセンブラーディレクティブも使用できます。

times 4 nop

Do-while-loops

CのDo-while-loop:

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

アセンブラーの同じループ:

        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

Whileループ

Cのwhileループ:

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

アセンブラーの同じループ:

        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

Forループの場合、cx-registerを使用する必要があります。これは、cx-registerがほとんど標準であるためです。他のループ条件については、好みの記録を取ることができます。もちろん、操作なしの命令は、ループで実行するすべての命令に置き換えてください。

39
Max Benson