zoukankan      html  css  js  c++  java
  • 汇编实验九

    一.实验内容

    1.完成在屏幕上输出内存单元中的十进制两位数

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

    3.教材实验9:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串‘weclome to masm’

    二.实验步骤

    1.代码如下

    ; 在屏幕上输出内存单元中的十进制两位数
    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

    实验结果如下:

     

    2.代码如下:

    ;完成在屏幕上输出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 si,0
          mov cx,5
    
    S:   mov ah,0 
          mov al,ds:[si]
          mov bl,10
          div bl
       
          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 si
    loop S
          mov ax,4c00h
          int 21h
    code ends
    end start
    

    实验截图如下:

     

    3.这题花费了不少时间 主要还犯了写低级错误  push  inc等后面竟然加了逗号

    另外一开始考虑循环  没注意到有些值之间相互影响

    尽量使用不同的寄存器

    此外为了满足题目要求输出在屏幕中间 做了些基础的计算,但很粗糙

    代码如下:

    assume ds:data, cs:code,ss:stack
    data segment
           db 'welcome to masm!'  
           db 2H,24H,71H        
    data ends
    stack segment
    db 0
    stack ends
    
    code segment
    start:  
            mov ax,data
            mov ds,ax  
            mov ax, stack
            mov ss,ax  
            
            mov ax,0b800H
            mov es,ax           
            mov bx,1920   
            mov si,0
            mov di,0
    
           mov cx,3
           mov bp,16
        
    
    s:     push cx
           mov cx,16
           mov si,60
           mov di,0
    
    s1:   mov al,ds:[di]
           mov es:[bx+si],al
           mov al,ds:[bp]
           mov es:[bx+si+1],al
           add si,2
           inc di
    loop s1
    
           add bx,160
           inc bp
           pop cx
    
    loop s
    
    code ends
    end start
    

    运行截图如下:

    在程序改bug过程中出现很多好玩的事

    如屏幕持续刷新图像,出现各种颜色

    这些都与写的循环有关

  • 相关阅读:
    由发货单批量生成发票时提示“连接失败”
    如何处理委托代销业务
    用友出纳通重装恢复
    如何查看用友通数据的版本
    出纳通如何重新年结?
    一致性错误导致
    销售出库单无法删除!
    用dos命令给系统用户添加用户组
    用友删除年度数据,删除帐套
    出纳通年结后如何查看过去的年度数据?
  • 原文地址:https://www.cnblogs.com/wtblogwt/p/10073610.html
Copyright © 2011-2022 走看看