desc: Decimal to character 把十进制转换为字符类型,显卡显示区只能显示字符。
code segment 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 assume cs:code,ds:data,ss:stack data segment db 10 dup(0) ;define bytes dw 10 ; define word dd 12666 ;7A31_low 16bit is in the front of the address db 10 dup(0); data ends ;数据段 stack segment dw 8 dup(0) stack ends ;栈段 code segment start:mov bx,data mov ds,bx mov si,0 mov bx,0 mov ax,0B800H ;0B800H 显存地址 mov es,ax mov ax,stack mov ss,ax mov sp,16 call dtoc ;十进制转换为字符类型 call count ;记录有多少个字符 call transfer call transfer_back ;将倒序字符反转 call show_str ;打印出字符 mov ax,4c00H int 21h
dtoc 1 2 3 4 5 6 7 8 9 dtoc: call divdw ;避免溢出除法 add cx,30H ;每个字符比数字大30H(16进制) mov ds:[bx],cl inc bx add ax,dx ;dx为高16位,ax为低16位 mov cx,ax ;cx为0时则无新的余数产生 jcxz over jmp short dtoc
divdw: 公式 X/n=(H*65536+L)/n=(H/n)*65536+(L/n) H=int(x/65536) L=rem(x/65536) 具体证明见汇编语言(第三版) 附注5
1 2 3 4 5 6 7 8 9 10 11 12 divdw: mov dx,ds:[14];ds[14] high 16bit mov ax,0;low 16bit div word ptr ds:[10]; 商存在ax,余数存在dx. push ax mov ax,ds:[12] div word ptr ds:[10]; mov cx,dx;cx the remainder pop dx mov ds:[12],ax mov ds:[14],dx ret
show_str:
1 2 3 4 5 6 7 8 9 10 show_str: mov ch,0 mov cl,ds:[bx] jcxz over mov dl,ds:[bx] mov dh,11000010b ;闪烁 mov es:[si],dx ;地址偶数位为字符,奇数位为模式 inc bx add si,2 jmp short show_str