assembly 为什么x86汇编程序不绘制符号

3pvhb19x  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(170)

我是一个大学生,我不知道我的错误在哪里。这是我的作业,用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

预计当您将光标放在颜色上时会选择一种颜色,然后当您将光标放在符号上时,它会将颜色更改为所选颜色

tpxzln5u

tpxzln5u1#

快速浏览一下,我看到了下面的错误:

cmp  di, 80
jg  another_row

DI寄存器在文本视频存储器中有一个地址。一行包含160个字节。您需要与cmp di, 160jnb another_row中的160进行比较。

mov  al, es:[di]  ; Get the value of the attribute
mov  es:[di], al  ; Change the value of the attribute

这不是我在之前的答案中写的!属性在es:[di+1]+1非常重要。您错误地检索并覆盖了ASCII字段。

相关问题