2016-11-30 13 views
-2

私はアセンブリで3ループのタイミングを取っています。
最初のループは10秒間動作していて、次に2秒間実行されるべき第2ループにジャンプします。 3番目は10秒以上働くことです。アセンブリの遅延ループを制御する方法

主な考えは、交通信号を構築することです。パラレルポートに接続されている各LEDは、TASMを使用して異なる時間をオンにする必要があります。
赤色:10秒。
レッド&オレンジ:2秒
グリーン:10秒
、その後、再び赤に取得...ので

上の任意のヘルプしてください? INT 21h、機能2Chを使って試してみました。

私の先生は、このようにうまくいくと教えてくれました。 まだ、コードを実行しようとしたときにLEDが点灯しませんでした。

私のコード:

.model small 
.stack 100 
.code 

Loop_time : 
mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add bx,cx 
mov dl,dh 
mov dh,0 
add bx,dx 
push bx 

loop_red : 

mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add ax,cx 
mov dl,dh 
mov dh,0 
add ax,dx 
add ax,0ah 
pop bx 
cmp ax,bx 
jg loop_redorange 
mov DX, 378h 
mov AL, 1 
out DX,AL 


loop_redorange: 
mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add ax,cx 
mov dl,dh 
mov dh,0 
add ax,dx 
add ax,0ch 
pop bx 
cmp ax,bx 
jg loop_green 
mov DX, 378h 
mov AL,3 
out DX,AL 


loop_green : 

mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add ax,cx 
mov dl,dh 
mov dh,0 
add ax,dx 
add ax,20h 
pop bx 
cmp ax,bx 
jg loop_red 
mov DX, 378h 
mov AL, 4 
out DX,AL 


mov ah,4ch 
int 21h 
end 
+0

実際に望むのは、遅延ループまたは同等のもので、単一の命令のタイミングや性能の測定ではありません。 –

+0

はい!正確に。それを助けてくれる?私のコードにはエラーはありませんでしたが、まだうまくいきませんでした! –

+0

投稿しないコードについてはお手伝いできません。あなたがしようとしていることを示す[mcve]はこれをより良い質問にするでしょう。 –

答えて

0

ハローループは次のとおりです。他のforループ

.model small 
.data 
    endloop db ? 
.stack 100 
.code 
    mov dx,378h 
    mov ah,2ch 
    int 21h 
    mov endloop,dh 
    add endloop,0ah ; for 10 second 
    cmp endloop,59 ; if endloop <= 60 then ok 
    jle loop_red 
    sub endloop,60 ; convert virtual second in real second 
loop_red: mov ax,003ch 
    mul cl 
    add dx, cl 
    mov bx,dx 
    add bx,000Ah 
    cmp dx,bx 
    jg loop_redorange 
    mov AL, 0001h 
    out DX,AL 
    xor ax,ax 
    mov ah,2ch 
    int 21h 
    cmp endloop,dh ; if current second == (begin second + 10) exit 
    jl loop_red 

$あなたが唯一のこのループを変更する必要があります。

+2

変更した内容を指摘して理由を説明した場合、これははるかに良い回答となります。 SOは、同様の問題を抱える将来の読者を助けることができる質問と回答についてのものです。したがって、説明はコードと同じくらい重要です。コードダンプの質問と回答はどちらも悪いです。 –

+0

新しい質問を投稿するのではなく、回答を編集することができます。しかし、あなたがすでにそれをしているので、おそらくあなたはこれを削除するべきです。 –

0

良い点 ループを行うためには、初期点と終点が必要です。この ための私は、エンドポイント 線MOVああ、2CH INT 21hを有するinizializedれる変数(ENDLOOP)はめ込また、時間・システムをロード のMOV ENDLOOP、DHと、変数に第二の保存。 add endloop、0ah;ループの計算終了値。 は今ENDLOOPの値にすることができ、我々はエンドループポイントに秒台を計算しているので、私は

Sub endloop,60 ; normalize endloop new range (0..59) 

$をENDLOOP正規化しなければなりません$

(0..59)は、第2の60を超える
cmp endloop,59 ; if endloop <= 60 then ok 
jle loop_red ;not need normalized go to loop 

です最初のものになります。 ループで始めることができます 私たちがしなければならないことをします(ラベルloop_red) 終了時ループが終了しているかどうかを確認します。 この私はそう:

xor ax,ax ; clear ax because is needed for system call 
mov ah,2ch ; now read how many time is passed. 
int 21h 
cmp endloop,dh ; the time is ending ? 
jl loop_red ; no repeat a loop 
;yes i can take dh (second for next loop) 

$私は今、その後、前より明確であることを願っています。

+0

これは素晴らしい情報です!本当にありがとう、私はそれを試し、何が起こるか教えてあげる。 –

+0

昨日から私のコードを更新しました。どのような問題がありますか? –

関連する問題