王爽 汇编 实验10.3

一、实验要求

 

 二、代码实现

  1 assume cs:code,ds:data
  2 
  3 data segment
  4     db 10 dup(0)
  5 data ends
  6 
  7 code segment
  8 start:      mov ax,12666
  9 
 10             mov bx,data
 11             mov ds,bx
 12             mov si,0
 13             
 14             call dtoc
 15 
 16             mov dh,8            ;定义行(0-24)
 17             mov dl,3            ;定义列(0-79)
 18             mov cl,2            ;定义颜色            
 19             call show_str        ;调用子程序,打印字符
 20 
 21             mov ax,4c00h
 22             int 21h
 23            
 24 dtoc:       push dx
 25             push cx
 26             push ax
 27             push si
 28             push bx
 29             
 30             mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
 31             
 32 s1:         mov cx,10d        ;d表示10进制,cx准备被除
 33             mov dx,0
 34             
 35             div cx            ;除以10
 36             mov cx,ax        ;得到商赋给cx
 37             jcxz s2
 38             
 39             add dx,30h        ;将余数加上30h得到相应的ascii码
 40             push dx
 41             
 42             inc bx
 43             jmp short s1
 44             
 45 s2:         add dx,30h        ;当商为0时,余数为个位
 46             push dx            
 47             inc bx            ;再一次进行栈操作(商为0而余数不为0的情况)
 48             
 49             mov cx,bx        ;总共有bx位进栈了,所以要循环此数位bx
 50             mov si,0
 51             
 52 s3:         pop ax            ;依次出栈将数据存放到指定的数据段中(内存中)
 53             
 54             mov [si],al
 55             inc si
 56             
 57             loop s3
 58                         
 59 okay:       pop bx
 60             pop si
 61             pop ax
 62             pop cx
 63             pop dx
 64             
 65             ret
 66         
 67 show_str:   push cx
 68             push si
 69 
 70             mov al,0A0h            ;每一行160个字节        
 71             dec dh                ;行号从0开始,需要减去1
 72             mul dh                ;求出行的偏移量(结果存放到了ax中)
 73             mov bx,ax            ;将行偏移量暂存到寄存器bx中
 74             
 75             mov al,2              ;一行2个字符
 76             dec dl                ;列号从0开始,需要减去1
 77             mul dl                ;求出列偏移量(结果存放到了ax中)
 78                     
 79             add bx,ax            ;行和列的偏移量加在一起,就是该字符串首地址在显存中的偏移地址
 80             
 81             
 82             mov ax,0b800h        ;显存段地址
 83             mov es,ax            ;现存段地址保存到es寄存器中
 84             
 85             
 86             mov di,0            ;显存中传递列值
 87             mov ch,0
 88             mov al,cl            ;颜色数据保存到ax寄存器低位中
 89             
 90 s:          mov cl,ds:[si]        ;传递数据
 91             jcxz ok                ;至到原始数据偏移到数据0的时候,表明所有原始数据已处理完成
 92                                   ;然后跳转到标号ok
 93             
 94             mov es:[bx+di],cl    ;传递数据
 95             mov es:[bx+di+1],al    ;传递颜色
 96             
 97             inc si                ;每处理一个字节,偏移地址自增1
 98             add di,2            ;每处理二个字节(包含一个数据和一个颜色属性),偏移地址自增2
 99             jmp short s
100 
101 ok:         pop si
102             pop cx            
103             ret
104 code ends
105 end start

 三、上机调试

待续

先上传一张结果图片

猜你喜欢

转载自www.cnblogs.com/TonyJia/p/12605974.html
今日推荐