【问题标题】:Using 80x86 Register as Array Index使用 80x86 寄存器作为数组索引
【发布时间】:2011-02-13 01:20:10
【问题描述】:

我一直在尝试解决这个问题。在我正在使用的程序中,例如,我使用键盘输入:

MOV AH,2h;
INT 21h;

基本上,在从控制台返回一个字符之后,我试图将该值提供给一个以 AL 作为数组索引的 MOV,例如:

MOV dl,array[[AL]]

在我的简单示例中,我正在提取一个 ASCII 值并根据我生成的表格吐出下一个字符(基本上只是一个任意练习)。

我已经尝试过数组[AL]、数组[[AL]],可能还有十几种其他方法。当我在 MASM 中组装我的代码时,我收到了这个错误:

**error A2031: Must be index or base register**

[AL] 不返回存储在 AL 寄存器/指针中的值吗?

我该如何进行这项工作?

【问题讨论】:

    标签: arrays assembly masm x86


    【解决方案1】:

    您需要在[] 中使用索引或基址寄存器。在 8086 模式下,仅有的两个基址寄存器是 BX 和 BP,而仅有的两个变址寄存器是 SI 和 DI。因此,您需要执行以下操作:

    mov BH,0;
    mov BL,AL
    mov DL,array[BX];
    

    而不是尝试直接使用 AL 作为基址寄存器。或者也可以尝试使用XLAT指令,大致相当于mov AL,[BX+AL]

    【讨论】:

    • 好的,很酷,谢谢。那行得通。不知道 XLAT 指令,这很酷。
    【解决方案2】:

    正如错误所说,您需要使用索引寄存器,例如 SI、DI 或基址寄存器 BX。如果我没记错的话,这里使用其他寄存器需要386模式。
    此外,当用作索引时,请记住,如果数组元素不是字节,则可能需要调整它们的大小(尽管在这种情况下您可能使用的是字节)。

    我猜索引语法应该是array[...],但距离我上次在汇编中写东西已经过去了 5 年多。

    还有一件事:AH 不应该是 01h 吗?
    http://spike.scu.edu.au/~barry/interrupts.html#ah01

    【讨论】:

    • 我一直在使用 8,因为它不回显。我想这个想法是输入一个东西,得到另一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多