• 实验报告:实验九


    实验内容:

    1. 补全程序 t1.asm,完成在屏幕上输出内存单元中的十进制两位数。

    ; 在屏幕上输出内存单元中的十进制两位数
    assume cs:code, ds:data
    data segment
         db 12
         db ?,?   ; 前一个字节用于保存商,后一个字节用于保存余数
    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:[1],al    ; 补全代码,让商保存到data段注释中指定的单元
          mov  ds:[2],ah    ; 补全代码,让余数保存到data段注释中指定的单元
    
          mov ah,2
          mov dl,ds:[1]    ; 补全代码,使得dl <-- data段中保存的商的字节单元数值
          add dl,30h       ; 补全代码,使得dl中的数值转换为数字字符
          int 21h
    
          mov ah,2
          mov dl,ds:[2]     ; 补全代码,使得dl <-- data段中保存余数的字节单元数值
          add dl,30h        ; 补全代码,使得dl中的数值转换为数字字符      
          int 21h
    
          mov ax,4c00h
          int 21h
    code ends
    end start
    

      

    add cx, 30H,表示把cx中的余数(数字)转变成字符,因为,‘0’的ASCII码为30H

    2. 补全程序 t2.asm,完成在屏幕上输出 data 段定义的 5 个十进制两位数,数据和数据
    之间以空格间隔。

    assume cs:code, ds:data
    data segment
         db 12,35,96,55,67
    data ends
    code segment
    start:
          ; 补全程序,参考t1.asm,综合应用以下知识完成:
          ; (1) loop指令、内存单元地址的灵活表示
          ; (2) div指令, 数字→数字字符的转换
          ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: 
          ;     mov ah,2
          ;     mov dl,待输出字符或其ASCⅡ码
          ;     int 21h
          ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符
          mov ax,data
          mov ds,ax
          mov bx,0
          mov cx,5
    
    s:    mov ah,0
          mov al,ds:[bx]
          mov dl,10
          div dl
    
          mov dl,al
          mov dh,ah
    
          mov ah,2
          add dl,30h
          int 21h
     
          mov ah,2
          mov dl,dh
          add dl,30h
          int 21h
    
          mov ah,2
          mov dl,0
          int 21h
    
          inc bx
          loop s
          mov ax,4c00h
          int 21h
    code ends
    end start

    代码如上结果如下:

    可以从图中看出我原来的结果只能出现第一组数即:12 00 00 00

    原因是一开始我将除数存在bl中,但是我又使用了bx作为偏移地址,结果两者相互影响和修改了。

    经过请教同学,将除数存在dl中,每次循环更新dl,dl的输出并不受影响,结果方才正确。

    3.书P187实验9

    本实验需要计算屏幕中间三行对应位置的单元数,我只大概进行了粗略了估算。

    ; 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
            
            ; 添加代码,通过循环逐个将每个字符及其属性送入相应的显示缓冲区对应行
            ; 即:将data段的字符及属性通过循环逐个mov到显示缓冲区(es)段相应的单元内
            
            ; 可以先尝试分别写三段代码,每次完成一行的显示
            ; 程序运行起来后,再尝试通过灵活的寻址方式和循环,对三段代码修改和简化
            ; 学习第10章子程序后,还可以进一步完善优化,设计子程序,将行号、列号、颜色属性设置成入口参数
            
            mov cx,3
            mov bx,0
            mov bx,1760
            mov bp,0
    
    s:      push cx
            mov cx,16
            mov di,0
            mov si,66
    
    s1:     mov al,ds:[di]
            mov es:[si+bx],al
            inc si
            mov al,ds:[bp+10h]
            mov es:[si+bx],al
            inc si
            inc di
    loop  s1
            inc bp
            add bx,160
            pop cx
    loop s
            mov ax,4c00h
            int 21h
    code ends
    end start

    结果如上图。

     总结和体会:

    1.对汇编中输出字符数字的方法程序有所掌握。

    2.更加熟练运用循环,双重循环压栈保护cx理解更深刻。

    3.对于汇编中彩色字符模式中的知识点有所掌握。

  • 相关阅读:
    利用反射实现JavaBean的自动赋值
    WebView加载网页文件
    android基础知识:SharedPreferences和PreferenceActivity
    java自定义注解
    Activity与Service通信
    两分钟彻底让你明白Android Activity生命周期(图文)!
    Android 判断SD卡是否存在及容量查询
    Android 使用ORMLite 操作数据库
    ormlite操作表记录
    异步编程之Javascript Promises 规范介绍
  • 原文地址:https://www.cnblogs.com/xue123/p/10088580.html
Copyright © 2020-2023  润新知