汇编语言程序设计实验报告九

南京信息工程大学实验报告

实验名称 实验 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颜色属性在屏幕上的呈现有了一些体会,收获颇丰。

posted @ 2018-12-11 18:06  CYMWN  阅读(1465)  评论(0编辑  收藏  举报