显示ascii码

2018-06-05  本文已影响0人  RRRussell

/* 编译步骤:
把此文件复制到dosbox86\tc中,
运行dosbox86
File->DOS Shell
cd \tc
tc
Alt+F选择File->Load->ascii.c
Alt+C选择Compile->Compile to OBJ 编译
Alt+C选择Compile->Line EXE file 连接
Alt+R选择Run->Run 运行
Alt+R选择Run->User Screen 查看结果
*/
C语言程序如下:

#include <dos.h>
#include <bios.h>
main()
{
   unsigned char a=0, hex[3];
   char far *p = (char far *)0xB8000000;
   int i, j, k;
   _AX = 0x0003;
   geninterrupt(0x10);     /* 设置视频模式为80*25文本模式, 同时起到清屏效果 */
   for(j=0; j<11; j++)     /* 共11列 */
   {
      p = (char far *)0xB8000000;
      p += j*7*2;          /* 计算第j列第0行的地址, 注意各列之间相距7个字符(含空格) */
                           /* 汇编中可以根据前后两列首地址相差14字节的规律,用加法计算
                              出下一列的地址
                            */
      for(i=0; i<25; i++)  /* 每列输出25个ASCII码, 即每列有25行 */
      {
         *p = a;           /* 输出当前ASCII字符 */
         *(p+1) = 0x0C;    /* 背景为黑色, 前景为高亮度红色 */
         sprintf(hex, "%02X", a);
                           /* 汇编中可以利用上课讲过的循环左移4位的方法把a的值转化
                              成2位十六进制并保存到数组hex中
                            */
         for(k=0; k<2; k++)/* 输出2位十六进制数 */
         {
            *(p+2+k*2) = hex[k];
            *(p+2+k*2+1) = 0x0A; /* 背景为黑色, 前景为高亮度绿色 */
         }
         a++;
         if(a==0)          /* 若a从0xFF变成0x00, 表示256个ASCII码已穷尽 */
            goto done;
         p += 160;         /* p指向第j列的第i+1行 */
      }
   }
   done:
   bioskey(0);             /* 汇编中可以用mov ah,0; int 16h;代替此函数调用 */
}

对应的汇编代码如下:

assume cs:code,ds:data,ss:stack

data segment
    a db 0h;
    color_ascii db  0Ch ;背景黑色,前景高亮度红色   00001100
    color_num   db  0Ah ;背景黑色,前景高亮度绿色   00001010
data ends

stack segment
    db 16 dup (0)
stack ends

code segment
    start:
    cls:
        mov ax,0B800H   ;显存地址
        mov es,ax
        mov bx,0
        mov cx,4000     ;文本模式显示25行,80字  
    s:
        mov dx,0
        mov es:[bx],dx        
        add bx,2
        loop s

        ;实现清屏

        mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,16
        mov ax,0B800H   ;第1行起始位置
        mov es,ax

        mov dl,0    ;从第0个字符开始
        mov bx,0
        mov cx,11 
        mov di,0  

        loop_x:
            push cx
            mov cx,25
            loop_y:
                push cx
                mov al,dl
                mov es:[bx][di],al  ;写ASCII码
                mov ah,ds:[1]
                mov es:[bx][di+1],ah    ;写ASCII码的属性
                add di,2    ;写完一个,移动两个字节

                mov al,dl
                mov ah,0
                mov cl,4
                rol ax,cl

                cmp ah,0Ah
                jb  num1
                jnb character1

                num1:
                    add ah,30h

                character1:
                    cmp ah,10h
                    jnb write1
                    add ah,37h

                write1:
                    mov es:[bx][di],ah  ;写ASCII码对应的数
                    mov ah,ds:[2]
                    mov es:[bx][di+1],ah    ;写数的属性
                    add di,2    ;写完一个,移动两个字节

                mov al,dl
                mov ah,0
                mov cl,4
                rol ax,cl
                ror al,cl

                cmp al,0Ah
                jb  num2
                jnb character2

                num2:
                    add al,30h

                character2:
                    cmp al,10h
                    jnb write2
                    add al,37h

                write2:
                    mov es:[bx][di],al  ;写ASCII码对应的数
                    mov ah,ds:[2]
                    mov es:[bx][di+1],ah    ;写数的属性
                    add di,2    ;写完一个,移动两个字节

                inc dl      ;显示的ascii码加1

                cmp dl,0    ;ascii码为0则跳转至exit
                je  exit 

                add bx,160
                sub di,6

                pop cx
            loop loop_y
            pop cx
            
            mov al,12
            sub al,cl
            mov bl,14
            mul bl
            mov di,0
            add di,ax
            
            ;切换到下一列

            mov bx,0

        loop again

        again:  jmp loop_x

        exit:
            mov ah,0
            int 16h

code ends
end start

结果如下:


1.jpg

DosBox下载的链接在下面给出
编译运行的方法如下:
运行DosBox86
把.asm文件放到masm文件夹中
命令行输入masm xxx(xxx是你的asm文件名)
紧跟着按三下回车
接着输入link xxx
继续按三下回车
生成可执行文件xxx.exe
输入xxx来运行
DosBox86百度网盘链接:
https://pan.baidu.com/s/1t17msyPIW9gwCN2rKM7MNg
提取码:
kss3

上一篇下一篇

猜你喜欢

热点阅读