MOV DX, n1[SI+TEM] 这行语句报错 帮我修改正确 D:\TEST.ASM(33): error A2031: must be index or base register
时间: 2024-03-20 10:41:41 浏览: 52
ALARM.rar_汇编语言_Asm_
这个错误是由于在使用`n1[SI+TEM]`时,`SI+TEM`的结果并不是一个有效的内存地址。这是因为`SI`和`TEM`都是寄存器,不能直接进行加法运算。解决这个问题的方法是,将`SI`和`TEM`分别存储在内存中,然后使用基址加偏移量的方式来引用`n1`数组中的元素。
下面是修改后的代码:
```
DATAS SEGMENT
n1 DB '1*1 1*2 1*3$','2*1 2*2 2*3$','33333333$','55554444$','5555555555$','6666666666$','777777777$','88888888$', '999999998$'
tem DW 0
Errmsg DB 'Please input 0-8!','$'
DATAS ENDS
STACKS SEGMENT
DB 100 DUP (?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
; 读取用户输入
MOV AH, 01H
INT 21H
SUB AL, '0'
CMP AL, 9
JA INPUT_ERR
; 输出对应的字符串
MOV CX, AX
LEA SI, n1
ADD SI, 2
lop1:
DEC CX
MOV TEM, CX
MOV BX, SI ; 将 SI 存储到 BX 中
ADD BX, TEM ; 将偏移量 TEM 加到 BX 中
MOV DL, [BX] ; 通过 BX 来引用 n1 数组中的元素
MOV AH, 02H
INT 21H
LOOP lop1
JMP START
INPUT_ERR:
; 输出错误提示信息
LEA DX, Errmsg
MOV AH, 09H
INT 21H
JMP START
CODES ENDS
END START
```
在这个修改后的代码中,我新增了一个寄存器`BX`来存储`n1`数组中的偏移量。通过将`SI`和`TEM`分别存储在`BX`中进行加法运算,最终得到的`BX`值就是`n1`数组中需要引用的元素的内存地址。然后使用`DL`寄存器来存储该元素的值,并通过`INT 21H`中断的功能`02H`来输出一个字符。
阅读全文