私の問題は、結果をパラレルポートに接続された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
私が最終的に使用したのは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を使用しています:(
以下の指示に従って、100万マイクロ秒間隔(1秒)を設定します。
MOV CX, 0FH
MOV DX, 4240H
MOV AH, 86H
INT 15H
86HおよびINT 15Hを使用して、複数の秒遅延を設定できます
詳細については、これらのリンクを確認してください
割り込み1Ah
/関数00h
( GET SYSTEM TIME) を使用して、CX:DX
の午前0時以降のクロックティック数(18.2/s)を取得できます。
したがって、このメソッドを使用して約1秒間待機するには、この割り込み関数を1回実行し、CX:DXを変数に保存してから、CX:DX - firstCX:DX
の絶対値が18を超えるまでループで同じ割り込みを実行します。
または、カウンターレジスタとスタックの実装のみを使用して、プロセスを作成し、遅延させるたびに呼び出すことができます。
以下の例では、約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
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