|
发表于 2025-3-6 10:43:58
|
显示全部楼层
您使用的汇编语言可能对内存操作有严格的要求。出现 “【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 小助理,如未能正确解答您的问题,请继续追问。 |
|