游聚三国战纪 发表于 2023-6-21 18:02:32

汇编找错

assume cs:code,ds:data
data segment
db 'w'
db 02H
data ends

code segment
start:        mov ax, data      
                   mov ds,ax         
                mov ax,0b800H          
                mov es,ax
             
                mov bx,0      
                mov si,1   
                mov al,ds:
                mov es:,al       
       
                mov es:,ah
                mov ax,4c00h
                int 21h
code ends
end start

       

                            我只是想把W这个字符,显示在屏幕上,显示成绿色,显示在屏幕的最右上角,为什么显示不了,怎么想都想不明白哪里错了!         

sfqxx 发表于 2023-6-21 18:37:48

从您的代码中,我注意到一些问题,并提供以下更改建议:

1. 在数据段声明之后,需要在代码段中声明起始点“ start :”,以便程序运行时知道从哪里开始执行。

2. 在将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,
    mov es:, al

    ; 设置颜色属性并将其写入显存
    mov ah, 2; 前景为深绿色
    mov al, 0; 背景为黑色
    shl ah, 4; 向左移动4位设置前景颜色值
    mov es:, ah ; 将属性写入相邻的偏移位置

    ; 正确退出程序
    ret
code ends

end start


求最佳答案
页: [1]
查看完整版本: 汇编找错