zoukankan      html  css  js  c++  java
  • 实验9 根据材料编程

    四、实验结论:

    任务一:完成在屏幕上输出内存单元中的十进制两位数

    Code:

    assume cs:code, ds:data
    data segment
         db 12
         db 0,0   
    data ends
    code segment
    start:
          mov ax,data
          mov ds,ax       
          
          mov ah,0
          mov al,ds:[0]   
          mov bl,10
          div bl
          mov  ds:[1],al    
          mov  ds:[2],ah    
    
          mov ah,2
          mov dl,ds:[1]    
          add dl,'0'      
          int 21h
    
          mov ah,2
          mov dl,ds:[2]    
          add dl,'0'        
          int 21h
    
          mov ax,4c00h
          int 21h
    code ends
    end start

    最后运行得到如下结果:


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

    Code: 

    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 si,0
      mov cx,5
    s:mov ax,0
      mov al,[si]
      mov bl,10
      div bl
      
      mov bx,ax
    
      mov dl,'0'
      add dl,bl
      mov ah,2
      int 21h
    
      mov dl,'0'
      add dl,bh
      mov ah,2
      int 21h
     
      mov ah,2
      mov dl,32
      int 21h
      
      
      inc si
      loop s
     
      mov ax,4c00h
      int 21h
    code ends
    end start

    运行结果:

    Tips:软中断指令是mov ah,2不是mov al,2,由于这个问题,之前代码运行的时候一直会自动跳出


    任务三:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

    Step1:计算出每一个条语句的起始偏移地址,已知我们使用的是80x25的彩色字符模式,我们需要显示三行,所以选择11、12和13行来输出字符。需要输出的字符需要占用16x2个的内存单元,一行有80x2=160个内存单元,因为要输出在屏幕中间,所以11行的起始偏移地址为1823,但是我们需要将字符的ascii码存储在偏移地址为偶数的空间里,所以可以选择偏移地址为1822或者1824,我所选择的是1824。

    Tips:我在做实验的过程中,由于只计算了中间位置没有考虑偶数偏移地址存储字符的ascii码导致了如下图案:(即使错误了,但是这个图案非常的可爱呀!)

    Step2:在把三条语句输出之前,我先尝试了只输出一条的情况:

    
    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            
            
            mov ax,0b800H
            mov es,ax            
            
            mov cx,16
            mov bx,0
            mov di,16
            mov si,1824
          s:mov al,[bx]
            mov ah,[di]
            mov es:[si],ax
            add si,2
            inc bx
            loop s
            
    
            mov ax,4c00h
            int 21h
    code ends
    end start

     运行结果:

    Step3:将三条语句同时输出,在输出一条语句的基础上还要完成显存偏移地址的变化和语句样式的改变,还需要处理用于控制循环次数CX寄存器中的值;

    Code:

    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            
            
            mov ax,0b800H
            mov es,ax            
            
            mov cx,3
            mov si,1824
            mov di,16
         s0:mov dx,cx
            mov bx,0
            mov cx,16
          s:mov al,[bx]
            mov ah,[di]
            mov es:[si],ax
            add si,2
            inc bx
            loop s
    
            add si,128
            inc di
            mov cx,dx
            loop s0
    
            mov ax,4c00h
            int 21h
    code ends
    end start

    运行结果: 


    五、总结与体会

    1、在实现多重循环的时候要及时保存CX的值

    2、注意在显存中保存数据的时候应该把字符的ASCII码放在偏移地址为偶数的内存单元中

    3、在调试的过程中,对汇编代码的整体认识更加清晰

  • 相关阅读:
    ThinkPHP框架基础知识
    ajax分页练习
    实例练习:购物车
    事件
    ajax基础
    jQuery事件
    jQuery基础
    PHP制作登录注册页面
    iview里tree组件改造
    Vue CLI及其vue.config.js(一)
  • 原文地址:https://www.cnblogs.com/Sun-Yiwen-blog/p/10058552.html
Copyright © 2011-2022 走看看