【发布时间】: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