您使用的汇编语言可能对内存操作有严格的要求。出现 “【bx+si】” 的错误提示可能是因为没有正确设置内存操作数,尤其是在合适的寄存器上。我们来仔细看一下您的代码,并做出一些调整建议:
请留意以下几点改动:
1. 确保使用的数据段和偏移量是绝对符合汇编语言规范的。
2. 调整代码以精确指定内存引用偏移,尤其是在使用 `ds` 段时。
以下是调整了的代码片段:
assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov dx, 0
mov ax, 12345
mov di, 10
mov si, 0
call dtoc
mov dh, 8 ;8行
mov dl, 3 ;3列
mov cl, 2 ;字符属性
call show_str
mov ax, 4c00h
int 21h
dtoc:
mov si, 9 ; 从数据段最大偏移地址开始保存数据
mov di, 10 ; 这里使用di用于除数操作,每次除10
mov cx, dx
jcxz dx_is0 ;如果dx=0,只需考虑ax
push dx
call loopfive
pop dx
mov ax, dx
jmp unknowloop
dx_is0:
mov cx, ax
jcxz num_is0 ; 当数字为0时
jmp unknowloop
num_is0:
mov dl, 0
add dl, 30h
mov [si], dl ; 在这你应该指定偏移
ret
unknowloop:
div di
add dl, 30h
mov [si], dl ; 使用正确的偏移进行存储
mov cx, ax
jcxz retpoint
dec si
jmp short unknowloop
loopfive:
mov cx, 5
five:
div di
add dl, 30h
mov [si], dl
dec si
loop five
ret
show_str:
mov ax, 0b800h
mov es, ax
mov al, 160
mul dh
mov di, ax
mov al, 2
mul dl
add di, ax
mov al, cl
mov cx, 10
save_str:
sub cx, si
jcxz retpoint
mov dl, [si]
mov [es:di], dl
mov [es:di+1], al
inc si
add di, 2
loop save_str
retpoint:
ret
code ends
end start
### 改动要点:
- 使用 `mov [si], dl` 而不是 `mov ds:, dl`。确保在进行内存访问时,明确指定偏移。
- 确保所有指令后的 `[]` 指定的是偏移。
- 确保 `ds` 和其他段寄存器的使用及其保存的数据是正确均衡的。
请使用上述代码进行调试。如问题依然存在,建议查看段寄存器设定及内存访问的详细规范,以确保符合汇编语言环境的标准要求。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |