|
发表于 2023-6-21 18:37:48
|
显示全部楼层
从您的代码中,我注意到一些问题,并提供以下更改建议:
1. 在数据段声明之后,需要在代码段中声明起始点“ start :”,以便程序运行时知道从哪里开始执行。
2. 在将DS寄存器设置为数据段之后,请确保使用 [ds:] 前缀操作数访问数据。
3. 在设置ES寄存器为B800H时,需要通过选择颜色模式来确定控制台前景(字符)和背景颜色。您可以通过计算相应的显存偏移量来保存字符和颜色属性。对于深绿色,前景颜色值为02h(0010b),背景颜色值为00h(0000b)。
4. 最后,您正在使用int 21h调用来终止程序,不幸的是这是一个DOS系统调用用于结束当前进程,并不适用于Windows上的控制台程序。您可以考虑使用 ret 指令代替 int 21h 来正确退出。
请注意,下面的代码片段可能不够全面,无法完全解决所有与您的代码相关的问题。但它提供了一个优化的版本,如果遵循上述更改建议,它应该可以满足您想要实现的功能。
- data segment
- db 'W'
- data ends
- code segment
- start:
- mov ax, @data
- mov ds, ax
- mov ax, 0B800h
- mov es, ax
- ; 确定字符和属性的偏移量
- mov bx, 79 ; 右上角第一下标
- mov si, 0 ; 字符串偏移量(“W”)
- mov dx, 5 ; 行号为5
- mul byte ptr dx ; 计算行偏移量
- mov dx, 6 ; 列号为6
- shl dx, 1 ; 计算列偏移量
- add bx, dx ; 计算总偏移量
- ; 将字符写入显存
- mov di, bx
- mov al, [ds:si]
- mov es:[di], al
- ; 设置颜色属性并将其写入显存
- mov ah, 2 ; 前景为深绿色
- mov al, 0 ; 背景为黑色
- shl ah, 4 ; 向左移动4位设置前景颜色值
- mov es:[di+1], ah ; 将属性写入相邻的偏移位置
- ; 正确退出程序
- ret
- code ends
- end start
复制代码
求最佳答案 |
|