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 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| assume cs:code,ss:stack,ds:data data segment num dw 123,12666,1,8,3,38 str db 10 dup(0) ;保存转化为ascii码后的字符串 data ends stack segment db 32 dup(0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,20H mov ax,data mov ds,ax mov si,0 mov cx,6 mov bx,16 ;在第几行显示 s: mov ax,[si] push cx ;保存循环状态 push si ;保存指向第几个数 push bx ;存下行数 mov si,0 ;调用子程序dtoc call dtoc ;将ax的数值转化为字符串保存在str中 pop bx ;取出行数 mov dh,bl ;行数 mov dl,16 ;列数 mov cl,2 mov si,offset str ;字符串的开始位置 call show_str ;调用子程序show_str inc bx ;行数加一 pop si add si,2 ;读取下一个数字 pop cx loop s mov ax,4c00h int 21H dtoc: mov bx,10 ;除数 mov dx,0 ;余数 div bx add dx,30H ;转为ascii码 push dx ;存下余数 inc si ;记录长度 mov cx,ax jcxz end_d ;被除数为零结束 jmp short dtoc end_d: mov cx,si mov si,0 p: pop ax ;将栈中的余数取出 mov [str+si],al ;保存到str中 inc si loop p mov al,0 mov [str+si],al ;str最后一位为0 RET show_str: mov ax,0B800H mov es,ax ;es指向显存地址 mov al,00A0H ;每行00A0字节 mul dh ;计算出行偏移量 push ax mov al,2 ;计算出列偏移量 mul dl pop di ;偏移地址=行偏移量+列偏移量 add di,ax ;存在di中
start_f: push cx ;颜色入栈 mov cx,0 mov cl,[si] ;取得字符 jcxz end_f ;判断是否为末位0 mov es:[di],cl ;低位存下字符 inc di ;指向高位 pop cx ;颜色出栈 mov es:[di],cl ;高位存下颜色 inc di ;指向显存下一个字 inc si ;指向下一个字符 jmp short start_f end_f: pop cx ;取出栈中cx后RET RET
code ends end start
|