实验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、在调试的过程中,对汇编代码的整体认识更加清晰

 

posted @ 2018-12-07 13:21  Sun-Yiwen  阅读(199)  评论(0编辑  收藏  举报