在屏幕上打印字符串时出现奇怪问题

qazxsw1982103 2004-11-27 06:04:55
以下程序的功能是:在屏幕的前3行显示不同颜色的字符串'welcome to masm!'
第一行显示红底高亮绿字
第二行显示红底闪烁绿字
第三行显示红底高亮闪烁绿字


检查好多遍,没发现错误
在DEBUG中调试的时候,发现显存中的值没有被我的程序改变,详情请看注释



assume cs:code,ds:data,ss:stack

code segment

mov ax,0b800H ;ES中存放显存地址
mov es,ax
mov si,0 ;si中存放列的偏移量
mov bp,0 ;bp中存放行的偏移量

mov ax,data
mov ds,ax
mov bx,0

mov ax,stack
mov ss,ax
mov sp,16

;以下将字符的颜色入栈

mov ax,11001010B ;红底高亮闪烁绿字
push ax
mov ax,11000010B ;红底闪烁绿字
push ax
mov ax,01001010B ;红底高亮绿字
push ax


mov dx,3 ;dx用于保存外层循环的cx的值

outer:
mov cx,16 ;循环inner块16次,每次读取data segment中的一个字符
pop ax ;将颜色出栈
mov ah,al ;将颜色设置到ah

inner:
mov al,[bx] ;al中存放字符的ASC码
mov word ptr es:[bp+si],ax ;将ax写入到显存,但显存中的值根本就没变化
inc bx ;自增bx
add si,2
loop inner

mov cx,dx ;读取dx
dec dx ;将dx自减
add bp,0a0H ;设置在显示器的下一行输出
loop outer


mov ax,4c00h
int 21h

code ends

data segment

db 'welcome to masm!'

data ends

stack segment

dw 0

stack ends

end
...全文
110 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
firespirit 2004-11-29
  • 打赏
  • 举报
回复
显存部分的内容不能直接用debug看
因为显存部分内存单元的值就是当前荧光屏上对应位置所显示的字符


assume cs:code

data segment
db 4 dup (0)
db 3 dup ('welcome to masm!')
data ends

stack segment
db 3 dup(0)
stack ends

code segment
start:
mov ax, data
mov ds, ax

mov ax, stack
mov ss, ax
mov sp, 0

mov ah, 184
mov al, 0
mov es, ax

mov si, 4
mov cx, 12
mov di, 0
m:
add di, 00A0H
loop m
add di, 64

mov ds:[0], 71H
mov ds:[1], 24H
mov ds:[2], 02H

mov cx, 3
s0:
push di

mov bp, cx
dec bp
mov bl, ds:[bp]

push cx
mov cx, 16
s1:
mov al, ds:[si]
mov es:[di], al
mov ah, bl
mov es:[di+1], ah
inc si
add di, 2
loop s1

pop cx
pop di
add di, 00A0H
loop s0

mov ax, 4c00H
int 21H
code ends
end start
qazxsw1982103 2004-11-28
  • 打赏
  • 举报
回复
d
qazxsw1982103 2004-11-27
  • 打赏
  • 举报
回复
谁帮帮我啊
这道题是《汇编语言》P175 页的实验题

实在看不出哪里错了
qazxsw1982103 2004-11-27
  • 打赏
  • 举报
回复
mov ah,0fh
int 10h

-------------------

加这句是什么意思??
csdsjkk 2004-11-27
  • 打赏
  • 举报
回复
assume cs:code,ds:data,ss:stack

code segment

mov ah,0fh
int 10h



mov ax,0b800H ;ES中存放显存地址
mov es,ax
mov si,0 ;si中存放列的偏移量
mov bp,0 ;bp中存放行的偏移量

mov ax,data
mov ds,ax
mov bx,0

mov ax,stack
mov ss,ax
mov sp,160

;以下将字符的颜色入栈

mov ax,11001010B ;红底高亮闪烁绿字
push ax
mov ax,11000010B ;红底闪烁绿字
push ax
mov ax,01001010B ;红底高亮绿字
push ax


mov dx,3 ;dx用于保存外层循环的cx的值

outer:
mov bx,0
mov si,0
mov cx,18 ;循环inner块16次,每次读取data segment中的一个字符
pop ax ;将颜色出栈
mov ah,al ;将颜色设置到ah

inner:
mov al,[bx] ;al中存放字符的ASC码
mov word ptr es:[bp+si],ax ;将ax写入到显存,但显存中的值根本就没变化
inc bx ;自增bx
add si,2
loop inner

mov cx,dx ;读取dx
dec dx ;将dx自减
add bp,0a0H ;设置在显示器的下一行输出
loop outer


mov ax,4c00h
int 21h

code ends

data segment

db 'welcome to masm!'

data ends

stack segment

dw 0

stack ends

end

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧