我试图确保我了解 SI 和 DI 寄存器。我的汇编语言背景在某种程度上仅限于 6502,所以请耐心等待。
我有一个关于如何使用 SI 作为简单计数器的快速示例。我有点担心我可能会滥用这个寄存器。
mov si, 0 ; set si to 0
mov cx, 5 ; set cx to 5 as we will count down to 1
do:
mov ah, 02h ; setup 02h DOS character output interrupt
mov dl, [table + si] ; grab our table with the si offset
add dl, '0' ; convert to ascii integer
int 21h ; call DOS service
inc si ; increment si
loop do ; repeat unto cx = 0
ret
table: db 1,2,3,4,5
---
OUTPUT:> 12345
这是使用 SI 的正确方法吗?我知道在 6502 程序集中,您可以使用 X 和 Y 寄存器来偏移数组/表。然而,在我对 x86 的研究中,我开始意识到还有很多东西可以使用。例如 CX 如何在“循环”指令中自动递减。
我希望继续前进,我将能够通过编写高效的代码来节省资源。
预先感谢您的意见。
最佳答案
SI
的这种使用非常好。在大多数英特尔调用约定中,SI 具有作为保留寄存器的好处。此外,从历史上看,SI 是少数几个可以在内存加载操作中用作索引的寄存器之一。在现代英特尔 CPU 中,任何寄存器都可以。SI
仍然通过 lods
指令得到一些特殊处理。
关于arrays - 如何在 x86 程序集中正确索引数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19819334/