web-dev-qa-db-ja.com

アセンブリ言語8086で1秒の時間遅延を設定する方法

私の問題は、結果をパラレルポートに接続されたLEDのセットに出力することになっているコードを書いたことです。コードを実行したとき、ほとんど何もしませんでした。インストラクターは、コードの実行速度が速すぎて、何が起こっているのかを目で確認できないと言いました。

時間遅延を行うにはいくつかの方法があることがわかりました。NOPをループさせようとしましたが、何が起こっているのか本当に判断できません。もっと良い方法はありますか?

ここに、時間遅延を追加する必要があるコードの一部があります。

org 100h

mov ax, 0
mov dx, 378
out dx, ax
mov ax, 1  

; 1st

mov cx, 1ah
start1st:
mov ax, 1
left:
out dx, ax 
; --------------------------------> how to loop?
mov bx, 2
mul bx
cmp ax, 80h
jl left
dec cx
cmp cx,0
jg start1st
; end 1st 
8
Jer Yango

私が最終的に使用したのはnopループでした

; start delay

mov bp, 43690
mov si, 43690
delay2:
dec bp
nop
jnz delay2
dec si
cmp si,0    
jnz delay2
; end delay

私は2つのレジスタを使用しました。これらのレジスタを両方とも高い値に設定し、両方の値がゼロになるまでループを続けます。

ここで使用したのはAAAAであり、どちらもSI and BP、私は各遅延ループについて約1秒で終了しました。

ヘルプの皆さん、ありがとうございます。そうです、私たちはこのアセンブリ言語コースでまだMS DOSを使用しています:(

2
Jer Yango

以下の指示に従って、100万マイクロ秒間隔(1秒)を設定します。

MOV     CX, 0FH
MOV     DX, 4240H
MOV     AH, 86H
INT     15H

86HおよびINT 15Hを使用して、複数の秒遅延を設定できます

詳細については、これらのリンクを確認してください

制御を呼び出し元に戻す前に、指定されたマイクロ秒数待機します

INT 15H 86H:待機

10
john

割り込み1Ah /関数00hGET SYSTEM TIME) を使用して、CX:DXの午前0時以降のクロックティック数(18.2/s)を取得できます。

したがって、このメソッドを使用して約1秒間待機するには、この割り込み関数を1回実行し、CX:DXを変数に保存してから、CX:DX - firstCX:DXの絶対値が18を超えるまでループで同じ割り込みを実行します。

8
Michael

または、カウンターレジスタとスタックの実装のみを使用して、プロセスを作成し、遅延させるたびに呼び出すことができます。

以下の例では、約1/4秒の遅延があります。

delay       proc
            mov     cx, 003H
    delRep: Push    cx
            mov     cx, 0D090H
    delDec: dec     cx
            jnz     delDec
            pop     cx
            dec     cx
            jnz     delRep
            ret
delay       endp
0
Alfred Benigno
DELAY_1SEC: MOV R3,#0AH;10D
LOOP1:      MOV R2,#64H;100D
LOOP2:      MOV R1,#0FAH;250D
LOOP3:      NOP
            NOP
            DJNZ R1,LOOP3;4x250Dx1,085us=1,085ms (0s.001ms010)/cycle
            DJNZ R2,LOOP2;3x100Dx1,085ms=325,5ms (0s.100ms309)/cycle
            DJNZ R3,LOOP1;3x10Dx325,5us=976,5ms (1s.604ms856)/cycle
            RET
0
kinAfro