麻烦请教一下,如何用汇编在屏幕上分别用绿色,绿底红色,白底蓝色输出“welcome to masm!“,

ASSUMECS:CODE,DS:DATADATASEGMENTDW5702H,4502H,4C02H,4302H,4F02H,4D02H,4502H,2002HDW54... ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DW 5702H,4502H,4C02H,4302H,4F02H,4D02H,4502H,2002H
DW 5402H,4F02H,2002H,4D02H,4102H,5302H,4D02H,2102H
DATA ENDS

CODE SEGMENT
START: MOV AX,DATA
MOV ES,AX
MOV AX,0B800H
MOV DS,AX
MOV BX,0H
MOV CX,16
S: MOV AX,ES:[BX]
MOV [BX],AX
INT 10H
ADD BX,1
LOOP S
INT 10H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
展开
 我来答
若以下回答无法解决问题,邀请你更新回答
百度网友f6753a1fd
2011-08-20 · TA获得超过821个赞
知道小有建树答主
回答量:294
采纳率:0%
帮助的人:365万
展开全部
; ============================================================================================
;
; 王爽汇编实验9 根据材料编程
; 要求:编程实现在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!' .
; 在80*25彩色字符模式下,显示器可显示25行,每行80个字符,每个字符可以有256种属性
; 02H表示黑底绿色
; 00100100B表示绿底红色
; 01110001B表示白底蓝色
;
; ============================================================================================

assume cs:codesg,ds:datasg,ss:stacksg

datasg segment
db 'welcome to masm!',0
datasg ends

stacksg segment

stacksg ends

codesg segment

start: mov ax,datasg
mov ds,ax

mov ax,0b800h
mov es,ax ; es初始化为视频缓冲区段地址

; 第一步,计算出屏幕中间的位置
; 书上给出的资料为:一个屏幕共显示25行,每行80个字符(160字节)
; 偶数字节放字符,奇数字节放字符属性
; 待显示的字符串长度为16个字节,算作16个字符
mov ax,12 ; 第13行
mov bx,160
mul bl ; 计算出前12行共多少字节,结果在ax中
add ax,64 ; 之所以加上64个字节是因为(160-16*2)/ 2=64 字节
; 这样才能保证字符串正好居中
mov di,ax ; 将结果放到目的地址寄存器中,配合es指向视频缓冲区中的目的位置
mov si,0 ; 初始化源地址寄存器,指向数据段中的源字符串

call ShowString1 ; 调用显示字符串的子程序

mov ax,4c00h
int 21h

ShowString1:
mov cx,16

loop_body:
mov al,[si]
mov es:[di],al
cmp al,' '
je loop_end ; 如果是空格就不设置颜色,直接进入下次循环

cmp al,'!'
je loop_end ; 如果是"!"就不设置颜色,直接进入下次循环

cmp cx,9
ja _w ; 如果是前七次循环,则设置为黑底绿色
cmp cx,6
ja _t ; 第九和第十次循环,则设置为绿地红色
cmp cx,1
ja _m ; 剩下的masm四个字母则设置为白底蓝色
jmp loop_end

; 以下是设置颜色
_w:
mov byte ptr es:[di+1],02H
jmp loop_end
_t:
mov byte ptr es:[di+1],00100100B
jmp loop_end
_m:
mov byte ptr es:[di+1],01110001B
loop_end:
inc si
inc di
inc di
loop loop_body

ret
codesg ends

end start
; 结果还是在cmd全屏模式下才能看到!!!
追问
您的程序很强悍,我编译连接也通过,只是还是不明白为什么我的不能运行?
追答
改成这样就行
1, 首先你定义方式错了,应该分开定义
2. 这程序里不需要int 10h中断
3. 16个字符加上16个颜色,应该循环32次
4. 建议bx专门用于取值,另外定义一个di专门用于传送值
========================================
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DW 57H,02H,45H,02H,4CH,02H,43H,02H,4FH,02H,4DH,02H,45H,02H,20H,02H
DW 54H,02H,4FH,02H,20H,02H,4DH,02H,41H,02H,53H,02H,4DH,02H,21H,02H
DATA ENDS

CODE SEGMENT
START: MOV AX,DATA
MOV ES,AX
MOV AX,0B800H
MOV DS,AX
MOV BX,0H
mov di,0
MOV CX,32
S: MOV Al,ES:[BX]
MOV [di],Al
;INT 10H
ADD BX,2
inc di
LOOP S
;INT 10H#
MOV AX,4C00H
INT 21H
CODE ENDS
END START
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式