8

私の問題は、パラレル ポートに接続された一連の 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 
4

6 に答える 6

11

以下の命令を使用して、100 万マイクロ秒間隔 (1 秒) を設定します。

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

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

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

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

INT 15H 86H: ウエイト

于 2014-03-04T18:20:05.453 に答える
8

割り込み1Ah/関数00h( GET SYSTEM TIME)を使用して、CX:DX.

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

于 2013-03-04T13:28:52.707 に答える
3

私が最終的に使用したのは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秒になりました。

助けてくれてありがとう、そしてはい、私たちはまだこのアセンブリ言語コースにMSDOSを使用しています:(

于 2013-03-06T15:43:59.757 に答える
1

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

以下の例では、およそ 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
于 2015-09-17T15:27:15.073 に答える
-1
.DATA TIK DW ?
...
MOV AX,00H
INT 1AH

MOV TIK,DX
ADD TIK, 12H

DELAY:
MOV AX,00H
INT 1AH
CMP TIK, DX
JGE DELAY

携帯からです。入ってすみません(;_;)

于 2013-09-23T17:10:49.150 に答える