
汇编语言实验9跪求详细解答。我在网络上看到答案,但就是看不懂!谢谢
展开全部
; ============================================================================================
;
; 王爽汇编实验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 ShowString ; 调用显示字符串的子程序
mov ax,4c00h
int 21h
ShowString:
mov cx,7
; 显示绿色的welcome
loop1:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],02h
inc si
inc di
inc di
loop loop1
; 显示welcome后的空格
mov al,[si]
mov es:[di],al
inc si
inc di
inc di
mov cx,2
; 显示绿底红色的to
loop2:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di],00100100B
inc si
inc di
inc di
loop loop2
; 显示to后的空格
mov al,[si]
mov es:[di],al
inc si
inc di
inc di
mov cx,4
; 显示白底蓝色的masm
loop3:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],01110001B
inc si
inc di
inc di
loop loop3
; 显示最后的!
mov al,[si]
mov es:[di],al
ret
codesg ends
end start
; 结果还是在cmd全屏模式下才能看到!!!
;
; 王爽汇编实验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 ShowString ; 调用显示字符串的子程序
mov ax,4c00h
int 21h
ShowString:
mov cx,7
; 显示绿色的welcome
loop1:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],02h
inc si
inc di
inc di
loop loop1
; 显示welcome后的空格
mov al,[si]
mov es:[di],al
inc si
inc di
inc di
mov cx,2
; 显示绿底红色的to
loop2:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di],00100100B
inc si
inc di
inc di
loop loop2
; 显示to后的空格
mov al,[si]
mov es:[di],al
inc si
inc di
inc di
mov cx,4
; 显示白底蓝色的masm
loop3:
mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],01110001B
inc si
inc di
inc di
loop loop3
; 显示最后的!
mov al,[si]
mov es:[di],al
ret
codesg ends
end start
; 结果还是在cmd全屏模式下才能看到!!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询