汇编语言实验9跪求详细解答
; ============================================================================================; ; 王爽汇编实验9 根据材料编程; 要求:编程实现在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!' 。 ; 在80*25彩色字符模式下,显示器可显示25行,每行80个字符,每个字符可以有256种属性; 02H表示黑底绿色; 00100100B表示绿底红色; 01110001B表示白底蓝色; ; ================================...全部
; ============================================================================================; ; 王爽汇编实验9 根据材料编程; 要求:编程实现在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm!' 。
; 在80*25彩色字符模式下,显示器可显示25行,每行80个字符,每个字符可以有256种属性; 02H表示黑底绿色; 00100100B表示绿底红色; 01110001B表示白底蓝色; ; ============================================================================================assume cs:codesg,ds:datasg,ss:stacksgdatasg segment db 'welcome to masm!',0datasg endsstacksg segment stacksg endscodesg 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 21hShowString: mov cx,7 ; 显示绿色的welcomeloop1: 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 ; 显示绿底红色的toloop2: 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 ; 显示白底蓝色的masmloop3: 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 retcodesg ends end start; 结果还是在cmd全屏模式下才能看到!!!。
收起