首先我们知道要显示12666,我们拿到这个整形数字了,要把他转换成字符串”12666”然而字符串的存储方式是ascii码,分别为31h,32h,36h,36h,36h一个字要显示,需要两个字节的属性,所以一共是10个字节。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| assume cs:code
data segment db 10 dup (0) data ends
code segment start:mov ax,12666//存储起来 mov bx,data mov ds,bx mov si,0//用于遍历字符 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str//找到显示起始点给他显示出来 mov ax,4c00h int 21h dtoc:push bx push ax putchar:div 10//余数存在dx中,为6 mov bl,30 add bl,dl //得到了ascii码 mov ds:[si],bl//把字符放进数据段 mov ch,0 mov cl,al jxcz ok//如果商为0了,那么就结束了 //如果还有字符 inc si mov dx,0//清零方便下一次存余数 jmp short putchar ok:pop ax pop bx ret show_str:push dx push cx push si //算偏移量找到显示位置 mov ax,B800h#先找到每个字符对应的偏移地址!这是段地址,每行160字节 mov es,ax//偏移地址存起来因为ax做乘法 mov ax,0 mov al,160 mul dh//结果存在ax中 mov bx,ax mov ax,0 mov al,2 mul dl add bx,ax//算出总偏移量 mov di,0 mov ax,0 mov al,cl//把字符属性移到al mov ch,0 show:mov cl,ds:[si]//把字符移过来 jcxz ok //如果不是最后一位 mov es:[bx+di+0],cl mov es:[bx+di+1],al add di,2 inc si jmp short show//省了一个cx循环的。 ok:pop si pop cx pop dx ret code ends end start
|
这里的show_str就是之前我们写过的显示函数,我们本次主要编写的是转换ascii的函数。