2016-11-30 68 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

我已经更新了我的代码,从昨天开始我就结束了。它有什么问题? –