arrays - 如何在 x86 程序集中正确索引数组

标签 arrays assembly x86 x86-16

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

相关文章:

ios - Swift:创建具有不同自定义类型的数组

c++ - 给定一个排序数组和一个参数 k,求在线性时间内大于或等于 k ​​的两个数之和的计数

arrays - 数组中元素出现的频率

c++ - 如何定位 WinRT 异步方法调用中出现错误的位置?

assembly - x86_64 程序集 : effects of the interrupt flag and TPR register

assembly - 如何在 x86 汇编语言中创建嵌套循环

assembly - 我应该为 Intel 8086 DOS 程序集使用什么代码框架?

c - 对字符串数组中的单词进行排序

c - 打印两次 NASM

assembly - Linux内核0.01引导加载程序使用rep movw,而不是rep movsw?这实际上是重复普通的 MOV 吗?