|
你的代码中,mov al,、mov es:,al 和 mov es:byte ptr ,0ah 这几句没有成功修改显存,主要原因有两个:
1. **地址操作数不完整**:在汇编中,mov al, 缺少源操作数(应该从数据段读取字符),而 mov es:,al 和 mov es:byte ptr ,0ah 缺少目标地址的偏移部分(应该指定显存的具体位置)。
2. **行偏移计算错误**:在第三行(s2 循环)中,add bx,140h 导致 bx 值变为 480(160 + 320),但第三行显存偏移应为 320(140h)。这会使写入位置超出预期行,可能显示在屏幕外。
修正后的关键点:
- 使用 mov al, [si] 从数据段读取字符。
- 使用 mov es:[bx+di], al 写入字符到显存低字节。
- 使用 mov byte ptr es:[bx+di+1], 0ah 写入属性到高字节(绿色)。
- 直接设置 bx 为每行的起始偏移,而不是累加。
以下是修正后的代码片段(只显示循环部分):
- assume cs:a
- d segment
- db 'welcome to masm'
- d ends
- e segment
- dw 2 dup(0)
- e ends
- a segment
- start:
- mov ax, d
- mov ds, ax ; ds 指向数据段
- mov ax, 0b800h
- mov es, ax ; es 指向显存段
- mov ax, e
- mov ss, ax
- mov sp, 4
- ; 第一行(偏移 0)
- mov cx, 15
- mov bx, 0 ; 行偏移
- mov si, 0
- mov di, 0
- s0:
- mov al, [si] ; 从数据段读字符
- mov es:[bx+di], al ; 写入字符到显存低字节
- mov byte ptr es:[bx+di+1], 0ah ; 写入属性(绿色)
- add si, 1
- add di, 2
- loop s0
- ; 第二行(偏移 160 = 0A0h)
- mov cx, 15
- mov bx, 160 ; 直接设置行偏移
- mov si, 0
- mov di, 0
- s1:
- mov al, [si]
- mov es:[bx+di], al
- mov byte ptr es:[bx+di+1], 0ah
- add si, 1
- add di, 2
- loop s1
- ; 第三行(偏移 320 = 140h)
- mov cx, 15
- mov bx, 320 ; 直接设置行偏移
- mov si, 0
- mov di, 0
- s2:
- mov al, [si]
- mov es:[bx+di], al
- mov byte ptr es:[bx+di+1], 0ah
- add si, 1
- add di, 2
- loop s2
- mov ax, 4c00h
- int 21h
- a ends
- end start
复制代码
这样修改后,字符和属性就能正确写入显存了。如果还有问题,检查调试器中的地址值是否指向 0B800h 段。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|