zoukankan      html  css  js  c++  java
  • 王爽《汇编语言》(第三版)实验9解析

    简介

    题目请对照书本

    代码

    assume cs:code
    data segment
    	db 'welcome to masm!'
    	db 02h,24h,71h  ; 要求的三个颜色对应的16进制代码
    data ends
    
    stack segment
    	db 16 dup(0)
    	; 也可以是下面的定义法:
    	; dw 8 dup(0)
    stack ends
    
    code segment
    
    start:	
    		; 设置data段,以及ds:bx指向data段的第一个单元,
    		; 即ds:[bx]的内容就是data段第一个单元的内容  
    		mov ax,data
    		mov ds,ax
    		
    		;设置显示缓存区段
    		mov ax,0b800h ;设置起始缓存
    		mov es,ax		
    		
    		;设置栈段
    		mov ax,stack
    		mov ss,ax
    		mov sp,10h  ;指向栈顶
    		
    		;初始化三个寄存器
    		mov bx,780h ; 行 从12-14行(注意:从第1行开始计数)
    		mov si,10h ; 颜色的偏移量,三次循环每次
    					; 增加 1h 指向下一个颜色
    		
    		mov cx,3    ; 三次循环改变行
    	s: 	mov ah,ds:[si] ;颜色事先存放在ah中
    		push cx		
    		push si
    		
    		
    		mov cx,16  ; 16次循环改变列
    		
    		mov si,64  ; 这里的si的意义是多少列,
    			; 为什么从64列开始呢?
    			; (1)字符串为32字节,16字节ASCLL码,16字节属性
    		    ; (2)每一行有160列,那么余下有 160-32=128列为空白
    			;    要使得字符串居中显示,那么字符串的左边和右边
    			;  	都应该是64字节(128/2),而列数是从0开始计数,
    			; 所以左边的64字节为0-63,所以这里偏移量为64
    		mov di,0  
    					
    	s0:	mov al,ds:[di] ;将date段中的字符一个一个传入es中
    		mov es:[bx+si],al ; 低位存放字符
    		mov es:[bx+si+1],ah ; 高位存放颜色
    		
    		add si,2  ;显示缓存区字符ASCII码偏移量为2
    		add di,1  ;data段字符的偏移量,每次加 1 
    		
    		loop s0
    		
    		pop si  
    		pop cx  ;后进先出,先出栈si,再出栈cx
    		
    		add si,1h  ;指向下一个颜色
    		add bx,0a0h ;指向下一行 160=0a0h
    		loop s
    		
    		mov ax,4c00h
    		int 21h
    code ends
    
    end start
    
    

    结果

    编译、链接、执行即可得到我们想要的结果。

    结果

  • 相关阅读:
    VS2015使用scanf报错解决方案
    C++的标准模板库(STL)简介
    C++中常用特殊符号简介(& , * , : , :: , ->)
    C++中#include <xxx.h>和#include "xxx.h"的区别(尖括号和双引号的区别)
    C++中#include的工作原理
    opencv中Mat与IplImage,CVMat类型之间转换
    C++数据类型简析
    让你在DOS中任意切换目录
    七种Prolog解释器/编译器
    C++中引用(&)的用法和应用实例
  • 原文地址:https://www.cnblogs.com/nojacky/p/9497704.html
Copyright © 2011-2022 走看看