2016-11-30 66 views
-2

我正在努力計算裝配中的3個循環。
第一個循環應該工作10秒,然後跳到第二個循環中執行2秒。第三是要再工作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

打招呼的循環是:

.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

好點 做一個循環,你必須有初始點和終點。 此 我已經插入圖示被inizialized與端點 線 MOV啊,2CH INT 21H的變量(ENDLOOP);加載時間系統 MOV ENDLOOP,DH;第二保存到變量中。 添加endloop,0ah;循環的計算結束值。 現在可以端環的該值超過60秒(0..59)

cmp endloop,59 ; if endloop <= 60 then ok 
jle loop_red ;not need normalized go to loop 

$所以既然我們已經計算出的循環結束點秒的牀我必須歸端環

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

$將是最初的。 所以我們可以從我們的循環開始 我們做我們必須做的事(標籤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

我已經更新了我的代碼,從昨天開始我就結束了。它有什麼問題? –