码迷,mamicode.com
首页 > 其他好文 > 详细

实验九

时间:2018-12-10 19:37:52      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:运行   数值转换   bsp   span   使用   偏移地址   png   利用   寻址方式   

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

技术分享图片

 

; 在屏幕上输出内存单元中的十进制两位数感觉就是取模()
assume cs:code, ds:data
data segment
     db 12   ;小于65565可以用ax寄存器存。一般都是以是16个字节为单位分配
     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;书上提到16位被除数默认于AX中
      mov bl,10
      div bl ;(ax)/(bl)
      mov  ds:[1h],al    ; 补全代码,让商保存到data段注释中指定的单元
      mov  ds:[2h],ah    ; 补全代码,让余数保存到data段注释中指定的单元

      mov ah,2
      mov dl,ds:[1]    ; 补全代码,使得dl <-- data段中保存的商的字节单元数值
      mov al,dl
      or al,30h
      mov dl,al
      int 21h; 补全代码,使得dl中的数值转换为数字字符(1)从内存单元中取出完成
    

      mov ah,2
      mov dl,ds:[2]     ; 补全代码,使得dl <-- data段中保存余数的字节单元数值
      mov al ,dl
      or al,30h
      mov dl,al       ; 补全代码,使得dl中的数值转换为数字字符      
      int 21h

      mov ax,4c00h
      int 21h
code ends
end start

 这里我把内存单元中的值放在寄存器中进行转换。

 

技术分享图片

 

 

补全程序 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 si,0;偏移地址
      mov cx,5
      mov bl,10;除数
      
      
 s:  
      mov ah,0
      mov al,ds:[si]
      div bl
       or al,30h;
      mov dl,al;
      mov ah,2
      int 21h
      
      mov ah,0
      mov al,ds:[si]
      div bl
      or ah,30h
      mov dl,ah
      mov ah,2
      int 21h
      
      
      mov dl, 
      mov ah,2
      int 21h
      
      inc si
      loop s
      mov ax,4c00h
      int 21h
code ends
end start

 

 技术分享图片

 

 冲突:调用库函数向屏幕输入字符需要向ah传入2 ,与div保存结果的ah冲突最终导致数据覆盖。我进行了两次运算。这显然不符合代码要求的精简。

try again:利用内存单元存储

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
      mov bl,10;除数
      
  s:  mov ah,0
      mov al,ds:[si]
      
      div bl
      or al,30h
      or ah,30h
      
      mov ds:[si+5],al
      mov ds:[si+5+1],ah
      
      mov dl,ds:[si+5]
      mov ah,2
      int 21h
      
      mov dl,ds:[si+5+1]
      mov ah,2
      int 21h
      
      mov dl,‘ ‘
      mov ah,2
      int 21h
       
      inc si
      loop s
 
      mov ax,4c00h
      int 21h
code ends
end start

技术分享图片

但是我想知道这两者哪个更快些,以及更精简的方法。

  

任务三:

 题目如下:

; 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,7;>=7 都是字母变色
        
        mov si,0
        mov di,0
   
        s:mov al,ds:[si]
        mov es:[di],al
        inc di
          mov al,2
          mov es:[di],al
        inc si
        inc di;the even stores the value
        loop s
     
       mov cx,2
       inc si
       add di,2
       
      s1: mov al,ds:[si]
        mov es:[di],al
        inc di
        mov al,24H
        mov es:[di],al
        inc di
        inc si
        loop s1
        
        
        mov cx,5
        inc si
        add di,2
        
    s2: mov al,ds:[si]
        mov es:[di],al
        inc di
        mov al,71h
        mov es:[di],al
        inc di
        inc si
        loop s2
        
        mov ax,4c00h
        int 21h
code ends
end start

 

 人为以空格为分隔点,分成三个字符串段。并在读取完成之后手动增加空格所占位移。

技术分享图片

一些规则

 数字转化为字符 or AL, 00110000B 或者 or  AL,30H 或者 and al ,30H

大写转成小写字母 or al,00100000b 或者 or al,20H 或者 and al,odfh(=ffh-20h) 或者sub al,20h

 

  

实验九

标签:运行   数值转换   bsp   span   使用   偏移地址   png   利用   寻址方式   

原文地址:https://www.cnblogs.com/hongjie-di/p/10097537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!