一、实验要求
二、代码实现
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
三、上机调试
待续
先上传一张结果图片