【问题标题】:not able to understand working of delay procedure in MASM [duplicate]无法理解 MASM 中延迟程序的工作 [重复]
【发布时间】:2018-11-18 08:57:32
【问题描述】:

我是 MASM 汇编语言编程的新手。 我在 MASM 中有一个硬件系统的延迟功能,但我无法理解它是如何工作的。你能通过添加cmets来逐行解释它是如何工作的代码是:

delay proc 
mov bx,02fffh 
l2: mov di,0ffffh 
l1: dec di 
jnz l1 
dec bx 
jnz l2 
ret
delay endp

很少有网站提供与 MASM 相关的内容,因此任何帮助都会非常有用。

【问题讨论】:

  • 2 个嵌套循环在做 - 几乎什么也没做,只是循环
  • 每条指令都需要一些时间来执行,所以如果你执行很多指令,你就会得到“延迟”。这种“什么都不做”的延迟效率不高,因为这意味着 CPU 不能同时执行一些“严肃”的计算,同样在现代 x86 上,也很难估计执行组将花费的确切时间量指令,但有时像这样的循环会有所帮助,尽管通常有更好的(性能和准确性)选项(需要更复杂的代码和/或操作系统支持)。
  • “很少有网站有 MASM 相关的东西”你搜索错误的东西。 MASM 只是微软的汇编程序,某种“编译器”;尝试搜索“8086 assembler”或“x86 assembler”
  • @Ped7g:每条指令都需要一些时间来执行。并非总是如此。如果循环中有额外的前端带宽会成为循环携带的依赖链延迟的瓶颈,那么独立指令不会减慢它的速度。例如与 486 或 P5 Pentium 不同,在内部循环中添加 nop 或三个不会使其在现代 x86 上变慢。这应该以每个时钟 1 次迭代的速度相当可靠地运行,除非它最终在 Skylake/Kaby Lake 上拆分为 32 字节边界(微码更新禁用了循环缓冲区)。
  • @Ped7g:这很公平,花时间与其他指令并行是看待它的好方法。这就是超标量 CPU 的全部意义所在。不过,摊销并不是正确的描述。

标签: assembly masm x86-16 microprocessors


【解决方案1】:
delay proc         ;start of function
mov bx,02fffh      ;Load literal into register bx
l2: mov di,0ffffh  ;Load literal into register di
l1: dec di         ;decrement di
jnz l1             ;Jump to l1 if di is not zero
dec bx             ;decrement bx
jnz l2             ;Jump to l2 if bx is not zero
ret                ;Return to caller
delay endp         ;end of function

这是一个嵌套循环。

【讨论】:

  • 你能解释一下 02fffh 和 0ffffh 表示多少延迟。如果我想要 1 秒或 5 秒的延迟,我该如何调整它如何选择这些值?
  • 将其转换为特定时间需要您对硬件设置有确切的了解。您没有提供此类信息。
猜你喜欢
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
相关资源
最近更新 更多