我试图确保我了解 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/

10-13 08:51