我是一个大学生,我不知道我的错误在哪里。这是我的作业,用x86汇编语言编写。(我用INTEL语法编写,我用DosBOX运行它)。
我以前也问过类似的问题。
任务是这样的
用任何文本填充显存的第0页。在屏幕的第一行,显示16个NUL字符(ASCII代码0),背景属性的值不同(符号属性的最高四元组)。在第一行按下左键以选择并存储所选颜色。当光标放置在屏幕其余行的任何字符上时,字符的颜色将通过按向左按钮变为所选的颜色。
但是现在我面临另一个问题。当我点击这个符号时,它并没有改变颜色。老实说,我已经很困惑了,不知道如何修复它。
.386
Data segment use16
ColorOne db 2fh
ColorMain db 0fh
sym db 100
style db ?
Data ends
Code segment use16
assume cs:Code, ds:Data
start:
mov ax, DATA
mov ds, ax
mov ax, 0B800h
mov es, ax
mov ax, 3 ; 80x35
int 10h
mov bx, 0
xor di, di
; screen fill
loop1:
add di, bx
imul di, 2
mov ah, ColorOne
mov al, 0
stosw
add ColorOne, 10h
inc bx
xor di, di
cmp bx, 16
jl loop1
mov bx, 1
loop2:
mov cx, 0
loop3:
add di, bx
imul di, 80
add di, cx
imul di, 2
mov ah, ColorMain
mov al, sym
stosw
inc cx
xor di, di
cmp cx, 80
jl loop3
inc bx
inc sym
cmp bx, 25
jl loop2
;---------------------------------------------------------
mov ax, 1 ; show cursor
int 33h
mov ax, 0ch
mov cx, 11b ; move and press left button
push es ; save segment status
push cs
pop es
lea dx, prmaus ; set the offset of the event processing procedure from the mouse in the code segment
int 33h ; registration of the address and conditions of the call
pop es
mov ah, 01h ; wait
int 21h ; pause
xor cx,cx ; disconect mouse
mov ax,0ch
int 33h
mov ax, 3 ; clean screen
int 10h
mov ax, 4c00h ; exit
int 21h
;----------------------------------------------------------
prmaus proc far
; saving the contents of registers ds, es
push ds
push es
pusha
push 0b800h
pop es
push Data
pop ds
; algorithm
to_left_mouse:
cmp ax, 10b
jne to_end
mov ax, 2 ; hide cursor
int 33h
shr cx, 3
shr dx, 3
mov di, dx
imul di, 160
add di, cx
add di, cx
cmp di, 80
jg another_row
first_row:
mov al, es:[di] ; Get the value of the attribute
mov style, al ; Store the color in the style variable
jmp to_end ; Jump to the end of the procedure
another_row:
mov al, style
mov es:[di], al ; Change the value of the attribute
to_end:
mov ax, 1 ; show cursor
int 33h
popa
pop es
pop ds
retf
prmaus endp
Code ends
end start
预计当您将光标放在颜色上时会选择一种颜色,然后当您将光标放在符号上时,它会将颜色更改为所选颜色
1条答案
按热度按时间tpxzln5u1#
快速浏览一下,我看到了下面的错误:
DI寄存器在文本视频存储器中有一个地址。一行包含160个字节。您需要与
cmp di, 160
jnb another_row
中的160进行比较。这不是我在之前的答案中写的!属性在
es:[di+1]
。+1
非常重要。您错误地检索并覆盖了ASCII字段。