Hello world”字符串。
80*25彩色字符模式显示缓冲区的结构。
B8000H~BFFFFH的32KB内存空间是80*25彩色字符模式的显示缓冲区。
ASCII码,高字节保存字符的显示属性。
80*2)*25 = 4000Byte的内存空间来存放一页的内容。
8页,通常显示第0页的内容。
其次是要知道如何实现将字符写入内存并显示出来。
ASCII码:即美国标准信息交换代码,用一个字节来表示。具体的表格请看附录!
〉〉显示缓冲区的属性:属性由一个字节表示,格式如下:
第/位: 7 6 5 4 3 2 1 0
BL
R:红色 G:绿色 B:蓝色, 0~2位:前景 3:高亮 4~6:背景 7 :闪烁)(闪烁只有在全屏模式下才有效)
01000111B
ASCII码+属性)
〉〉写入内存的方法
mov 内存地址X,ASCII码
mov 内存地址X+1,属性代码
直接写入就可以显示
注意:
Hello World的方法不止这一种
DOS下才能看见,如果系统是Windows vista 以上的可能不会显示,Windows xp 下有时看不见。具体可以安装一个虚拟机,推荐Microsoft Virtual PC 2007,下载地址请看附注。
现在来看代码:
1 ; 程序原理:将字符串从数据段逐字符拷贝到显示空间里,因为要显示在中央,以缓冲区第
2 ;0页的第一个地址为段地址,计算得出其第一个字符的ASCII码存放位置应为B800:07C0H
3 ;在拷贝的同时设定属性,共一个循环。
4
5 assume cs:code
6
7 data segment
8 db 'Hello world!' ; 定义字符串
9 data ends
10
11 code segment
12
13 start: ; 程序入口
14
15 mov ax,data
16 mov ds,ax ; 初始化数据段
17 mov ax,0b800h
18 mov es,ax ; 用附加寄存器初始化显示段
19
20 mov cx,12d ;循环次数
21 mov si,0h ; 初始化数据段偏移地址
22 mov di,0h ; 初始化显示段偏移地址
23
24 put: ; 逐个字符输出
25 mov al,ds:[si] ; 把字符的ASCII码放入al中
26 mov es:7c0h[di],al ; 从al中读取ASCII码写入显示段
27 mov word ptr es:7c1h[di],01000111b ; 设置属性
28 inc si ; 移动到数据段的下一个字符
29 add di,2d ; 移动到显示段的下一个字符显示空间
30 loop put ; 执行循环
31
32 mov ax,4c00h
33 int 21h ; 程序返回
34
35 code ends
36
37 end start
程序执行的结果:
使用Microsoft Virtual PC 2007 并安装MS-DOS 6.22
尝试:优化代码并编译执行。
00000000 | 0 | 00 | NUL(null) | 空字符 |
00000001 | 1 | 01 | SOH(start of headling) | 标题开始 |
00000010 | 2 | 02 | STX (start of text) | 正文开始 |
00000011 | 3 | 03 | ETX (end of text) | 正文结束 |
00000100 | 4 | 04 | EOT (end of transmission) | 传输结束 |
00000101 | 5 | 05 | ENQ (enquiry) | 请求 |
00000110 | 6 | 06 | ACK (acknowledge) | 收到通知 |
00000111 | 7 | 07 | BEL (bell) | 响铃 |
00001000 | 8 | 08 | BS (backspace) | 退格 |
00001001 | 9 | 09 | HT (horizontal tab) | 水平制表符 |
00001010 | 10 | 0A | LF (NL line feed, new line) | 换行键 |
00001011 | 11 | 0B | VT (vertical tab) | 垂直制表符 |
00001100 | 12 | 0C | FF (NP form feed, new page) | 换页键 |
00001101 | 13 | 0D | CR (carriage return) | 回车键 |
00001110 | 14 | 0E | SO (shift out) | 不用切换 |
00001111 | 15 | 0F | SI (shift in) | 启用切换 |
00010000 | 16 | 10 | DLE (data link escape) | 数据链路转义 |
00010001 | 17 | 11 | DC1 (device control 1) | 设备控制1 |
00010010 | 18 | 12 | DC2 (device control 2) | 设备控制2 |
00010011 | 19 | 13 | DC3 (device control 3) | 设备控制3 |
00010100 | 20 | 14 | DC4 (device control 4) | 设备控制4 |
00010101 | 21 | 15 | NAK (negative acknowledge) | 拒绝接收 |
00010110 | 22 | 16 | SYN (synchronous idle) | 同步空闲 |
00010111 | 23 | 17 | ETB (end of trans. block) | 传输块结束 |
00011000 | 24 | 18 | CAN (cancel) | 取消 |
00011001 | 25 | 19 | EM (end of medium) | 介质中断 |
00011010 | 26 | 1A | SUB (substitute) | 替补 |
00011011 | 27 | 1B | ESC (escape) | 溢出 |
00011100 | 28 | 1C | FS (file separator) | 文件分割符 |
00011101 | 29 | 1D | GS (group separator) | 分组符 |
00011110 | 30 | 1E | RS (record separator) | 记录分离符 |
00011111 | 31 | 1F | US (unit separator) | 单元分隔符 |
00100000 | 32 | 20 | (space) | 空格 |
00100001 | 33 | 21 | ! |
|
00100010 | 34 | 22 | " |
|
00100011 | 35 | 23 | # |
|
00100100 | 36 | 24 | $ |
|
00100101 | 37 | 25 | % |
|
00100110 | 38 | 26 | & |
|
00100111 | 39 | 27 | ' |
|
00101000 | 40 | 28 | ( |
|
00101001 | 41 | 29 | ) |
|
00101010 | 42 | 2A | * |
|
00101011 | 43 | 2B | + |
|
00101100 | 44 | 2C | , |
|
00101101 | 45 | 2D | - |
|
00101110 | 46 | 2E | . |
|
00101111 | 47 | 2F | / |
|
00110000 | 48 | 30 | 0 |
|
00110001 | 49 | 31 | 1 |
|
00110010 | 50 | 32 | 2 |
|
00110011 | 51 | 33 | 3 |
|
00110100 | 52 | 34 | 4 |
|
00110101 | 53 | 35 | 5 |
|
00110110 | 54 | 36 | 6 |
|
00110111 | 55 | 37 | 7 |
|
00111000 | 56 | 38 | 8 |
|
00111001 | 57 | 39 | 9 |
|
00111010 | 58 | 3A | : |
|
00111011 | 59 | 3B | ; |
|
00111100 | 60 | 3C | < |
|
00111101 | 61 | 3D | = |
|
00111110 | 62 | 3E | > |
|
00111111 | 63 | 3F | ? |
|
01000000 | 64 | 40 | @ |
|
01000001 | 65 | 41 | A |
|
01000010 | 66 | 42 | B |
|
01000011 | 67 | 43 | C |
|
01000100 | 68 | 44 | D |
|
01000101 | 69 | 45 | E |
|
01000110 | 70 | 46 | F |
|
01000111 | 71 | 47 | G |
|
01001000 | 72 | 48 | H |
|
01001001 | 73 | 49 | I |
|
01001010 | 74 | 4A | J |
|
01001011 | 75 | 4B | K |
|
01001100 | 76 | 4C | L |
|
01001101 | 77 | 4D | M |
|
01001110 | 78 | 4E | N |
|
01001111 | 79 | 4F | O |
|
01010000 | 80 | 50 | P |
|
01010001 | 81 | 51 | Q |
|
01010010 | 82 | 52 | R |
|
01010011 | 83 | 53 | S |
|
01010100 | 84 | 54 | T |
|
01010101 | 85 | 55 | U |
|
01010110 | 86 | 56 | V |
|
01010111 | 87 | 57 | W |
|
01011000 | 88 | 58 | X |
|
01011001 | 89 | 59 | Y |
|
01011010 | 90 | 5A | Z |
|
01011011 | 91 | 5B | [ |
|
01011100 | 92 | 5C | \ |
|
01011101 | 93 | 5D | ] |
|
01011110 | 94 | 5E | ^ |
|
01011111 | 95 | 5F | _ |
|
01100000 | 96 | 60 | ` |
|
01100001 | 97 | 61 | a |
|
01100010 | 98 | 62 | b |
|
01100011 | 99 | 63 | c |
|
01100100 | 100 | 64 | d |
|
01100101 | 101 | 65 | e |
|
01100110 | 102 | 66 | f |
|
01100111 | 103 | 67 | g |
|
01101000 | 104 | 68 | h |
|
01101001 | 105 | 69 | i |
|
01101010 | 106 | 6A | j |
|
01101011 | 107 | 6B | k |
|
01101100 | 108 | 6C | l |
|
01101101 | 109 | 6D | m |
|
01101110 | 110 | 6E | n |
|
01101111 | 111 | 6F | o |
|
01110000 | 112 | 70 | p |
|
01110001 | 113 | 71 | q |
|
01110010 | 114 | 72 | r |
|
01110011 | 115 | 73 | s |
|
01110100 | 116 | 74 | t |
|
01110101 | 117 | 75 | u |
|
01110110 | 118 | 76 | v |
|
01110111 | 119 | 77 | w |
|
01111000 | 120 | 78 | x |
|
01111001 | 121 | 79 | y |
|
01111010 | 122 | 7A | z |
|
01111011 | 123 | 7B | { |
|
01111100 | 124 | 7C | | |
|
01111101 | 125 | 7D | } |
|
01111110 | 126 | 7E | ~ |
|
01111111 | 127 | 7F | DEL (delete) | 删除 |