assume cs:codesg datasg segment db 10 dup(0) datasg ends stacksg segment db 16 dup(0) stacksg ends codesg segment start: mov bx,stacksg mov ss,bx mov sp,10h;设置ss:sp指向栈段stacksg mov ax,9768h mov dx,005ah;ax和dx是要显示的数据的低16位和高16位 mov bx,datasg mov ds,bx mov si,10;设置ds:[si]指向将要存储显示数据转换成对应的字符串的段空间,由于做除法是得到的数据是从低位到高位,存储时要逆序存储 mov byte ptr ds:[si],0;给存储显示数据转换成对应的字符串的末尾设置为0 call dtoc;调用dtoc把要显示的数据的每位数字转换成对应的字符值 mov dh,8;设置要显示的行号 mov dl,3;设置要显示的列号 mov cl,2;设置要显示的字体的颜色为绿色 mov ax,0b800h mov es,ax mov bx,0;设置es:[bx]指向显示缓冲区段空间 mov di,0;在调用显示字符的子程序时要用到di做缓存,先清零。 call show_str;调用显示字符串的子程序 mov ax,4c00h int 21h dtoc: mov cx,ax jcxz dtocOK;如果得到的商是0就说明要显示的数据的各位的值已经被全部求出 mov cx,10;要转换成十进制数据所以除数是10 push si push ax;下面的程序要用到si和ax,这里把它们入栈保存起来 ;接下来就是公式X/N=int(H/N)*65536+(rem(H/N)*65536+L]/N的应用了 mov ax,dx;先是H/N,把要显示的数据的高位给ax,即H/N中的H做被除数 mov dx,0;故要把dx清零 div cx ;cx中存放的是除数 mov si,ax;把所得的商(保存在ax中)给si保存起来,所得的余数在dx中,也就是rem(H/N)*65536 pop ax;把之前在ax中存放的要显示的低16位值给ax,此时dx中存放的就是rem(H/N)*65536。ax存放了要做除法的低16位,即公式中的L, div cx mov cx,dx;dx中的是X/N所得的余数 mov dx,si;si中存放的是X/N所得的商 pop si;恢复si的值 add cx,30h;把余数加上30h即使该位数值对应的字符了 sub si,1 mov ds:[si],cl jmp short dtoc dtocok:ret show_str: mov dh,8;行号 mov dl,3;列号 ;我们在第九章的实验材料中知道显示的一行的偏移为0a0h mov al,0a0h dec dh;因为0a0h是第二行的开始,所以减去1后,即要在第八行显示,就要7*0a0h,不减的话就是在第九行显示了 mul dh;8行的偏移所以是7*0a0h mov bx,ax;把上面乘积的值给我们使用的偏移地址的寄存器bx mov al,2;由于每个字符占用两个字节即一个字 mul dl;空出6个字节即三个字。从第四个字开始填充要显示的字符 add bx,ax;这是计算出来的放第一个自发的起始地址 show: mov di, cx;把cx的值给缓存起来 mov cl,ds:[si];取每个要显示的字符 jcxz ok;为零就表示要显示的字符已经到达了末尾 mov al,cl;把要显示的字符对应的值给al mov cx,di;从di中恢复cx的值,在cx中存放了要显示的字体的颜色 mov ah,cl;把显示属性值给ah mov es:[bx],ax add bx,2 inc si jmp short show ok:ret codesg ends end start 显示效果:图片传不了