南京信息工程大学实验报告
实验名称 实验 9 根据材料编程
实验日期 12.10
得分
学院 计软院
专业 计算机科学与技术
年级 2017级
班次 17计算机科学与技术(5)班 姓名 陈奕明 学号 20171308194
一、实验目的
1. 掌握十进制两位数输出的方法
2. 理解80×25彩色字符模式显示原理
3. 综合应用寻址方式和汇编指令完成应用编程
二、实验准备
1. 复习数值和数字字符之间的转换方法,div指令用法
2. 学习P187-189支撑材料及「实验9提示」(本文档最后一部分)
3. 复习灵活的寻址方式及本次实验中用到的指令,如mov, loop,div等。
三、实验内容
1. 补全程序t1.asm,完成在屏幕上输出内存单元中的十进制两位数
源码如下:
; 在屏幕上输出内存单元中的十进制两位数 assume cs:code, ds:data data segment db 12 db 0,0 ; 前一个字节用于保存商,后一个字节用于保存余数 data ends code segment start: mov ax,data mov ds,ax ; 补全指令,使得ds <-- data段地址 mov ah,0 mov al,ds:[0] ; ax <-- data段字节单元的被除数12 mov bl,10 div bl mov ds:[9],al ; 补全代码,让商保存到data段注释中指定的单元 mov ds:[10],ah ; 补全代码,让余数保存到data段注释中指定的单元 mov ah,2 mov dl,ds:[9] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值 add dl,30h ; 补全代码,使得dl中的数值转换为数字字符 int 21h mov ah,2 mov dl,ds:[10] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值 add dl,30h ; 补全代码,使得dl中的数值转换为数字字符 int 21h mov ax,4c00h int 21h code ends end start
2. 补全程序t2.asm,完成在屏幕上输出data段定义的5个十进制两位数,数据和数据 之间以空格间隔。
源码如下:
assume cs:code, ds:data data segment db 12,35,96,55,67 data ends code segment start: mov ax,data mov ds,ax mov di,0 mov cx,5 s1:mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s1 ; 补全程序,参考t1.asm,综合应用以下知识完成: ; (1) loop指令、内存单元地址的灵活表示 ; (2) div指令, 数字→数字字符的转换 ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: ; mov ah,2 ; mov dl,待输出字符或其ASCⅡ码 ; int 21h ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符 mov ax,4c00h int 21h code ends end start
3. 教材实验9(P187)
源码如下:
; p187 实验9 assume ds:data, cs:code data segment db 'welcome to masm!' db 2H,24H,71H ;字符串属性值 data ends code segment start: mov ax,data mov ds,ax ;字符串及属性值所在段的段地址送入ds mov ax,0b800H mov es,ax ;80×25彩色字符模式显示缓冲区段地址送入es mov si,0 ;使用si指令寄存器 mov di,0 ;使用di指令寄存器 mov cx,10h ;连同空格共计16个字符,16次循环 s1:mov dl,ds:[si] mov es:[di + 06e0h],dl; ;通过计算可得第11行的偏移地址为6e0h,即06e0h=16^2*6+14*16,根据偏移地址,每次取出一个字符向3行赋值 mov es:[di + 0780h],dl; ;通过计算可得第12行的偏移地址为6e0h,即0780h=16^2*7+8*16,根据偏移地址,每次取出一个字符向3行赋值 mov es:[di + 0820h],dl; ;通过计算可得第13行的偏移地址为6e0h,即0820h=16^2*8+2*16,根据偏移地址,每次取出一个字符向3行赋值 mov dh,ds:[10h] mov es:[di + 06e0h + 1],dh ;根据偏移地址向上面已经输入的字符赋予其字符属性 mov dh,ds:[11h] mov es:[di + 0780h + 1],dh mov dh,ds:[12h] mov es:[di + 0820h + 1],dh inc si add di,2 ;每次会动用两个字节的空间 loop s1 mov ax,4c00h int 21h code ends end start
具体分析过程已经在源码注释中写明:
四、实验结论
实验结果如下:
实验一:
结果如上,与要求相同
实验二:
实验二只是比实验一多输出了一个数字字符,多输出了几次空格。结果如上
实验三:
具体的分析步骤已经写在了源码的注释当中,这个实验的核心思想在于25列的列数计算以及对应单个字符区域的属性操作,即奇数地址存放其属性,偶数地址存放其字符,结合loop循环进行实现。
五、总结与体会
输出单个字符的操作主要还是使用对ASCII码值的修改,通过div命令取出各个数位字符,结合int 21h命令的2号子功能来对屏幕进行的输出。而对实验九,通过对80*25彩色字符区域的操作,对RGB颜色属性在屏幕上的呈现有了一些体会,收获颇丰。