【问题标题】:How to control delay loops in assembly如何控制装配中的延迟循环
【发布时间】:2016-11-30 04:44:55
【问题描述】:

我正在为装配中的 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

【问题讨论】:

  • 所以你真正想要的是延迟循环或等效的,而不是对单个指令进行计时或测量性能。
  • 是的!确切地 。有什么帮助吗?我的代码没有错误,但还没有工作,哈哈!
  • 我们无法为您提供您未发布的代码。一个minimal reproducible example 来表明你正在尝试做什么会让这个问题变得更好。
  • 非常感谢您的合作 .. 请原谅我的无知,我对整个事情都是新手 :)
  • "but it didn't work"仍然不是问题描述。请参阅 How to Askminimal reproducible example。您应该准确地描述它当前所做的事情,以及您在调试器中看到的任何有用的内容。

标签: assembly time x86 dos tasm


【解决方案1】:

你好,循环是:

.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 

$ 对于其他循环,您只能更改此循环。

【讨论】:

  • 如果您指出您所做的更改并解释原因,这将是一个更好的答案。 SO 是关于可以帮助未来读者解决类似问题的问题和答案,因此解释至少与代码一样重要。代码转储问题和答案都很糟糕。
  • 你可以edit你的答案,而不是发布一个新的。但既然你已经这样做了,也许你应该删除这个。
【解决方案2】:

好点 要进行循环,您必须具有初始点和端点。 为了这 我插入了一个用端点初始化的变量(endloop) 线 mov ah,2ch int 21h ;加载时间系统 mov endloop,dh ;将第二个保存到变量中。 add endloop,0ah ;计算循环结束值。 现在可以是 endloop 的值超过 60 秒 (0..59)

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

$所以我必须标准化 endloop

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)

$ 我希望现在比以前更清楚。

【讨论】:

  • 这是一些很棒的信息! .. 真的很感激,我会尝试并告诉你会发生什么。
  • 我已将我的代码更新为昨天以来的结果。它有什么问题?
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多