Hello World程序

本文最初发表于2015-8-??,是由别的地方迁移过来的

  本文利用改写内存的办法在屏幕中央显示“Hello world”字符串。

 

  首先我们需要了解80*25彩色字符模式显示缓冲区的结构。

  〉〉内存中B8000H~BFFFFH32KB内存空间是80*25彩色字符模式的显示缓冲区。

  〉〉一个字符要在该缓冲区中显示需要一个字的空间。低字节保存字符的ASCII码,高字节保存字符的显示属性。

  〉〉需要(80*2*25 = 4000Byte的内存空间来存放一页的内容。

  〉〉该缓冲区分为8页,通常显示第0页的内容。

  其次是要知道如何实现将字符写入内存并显示出来。

  〉〉ASCII码:即美国标准信息交换代码,用一个字节来表示。具体的表格请看附录!

  〉〉显示缓冲区的属性:属性由一个字节表示,格式如下:

  第/位: 7      6     5     4     3     2     1     0

  表示   BL     R     G     B     I     R     G     B  

  (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

尝试:优化代码并编译执行。


下载Microsoft Virtual PC

下载MS-DOS 6.22

 

ASCII码表(来源:http://www.asciima.com/ )

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

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)

设备控制

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

 

00110010

50 

32 

2

 

00110011

51 

33

 

00110100

52 

34 

4

 

00110101

53 

35

 

00110110

54

36

6

 

00110111

55 

37 

 

00111000

56 

38

 

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 

 

01000011

67

43

C

 

01000100

68 

44 

 

01000101

69

45

E

 

01000110

70

46 

F

 

01000111

71

47

G

 

01001000

72 

48

 

01001001

73

49

I

 

01001010

74 

4A

 

01001011

75

4B

K

 

01001100

76 

4C 

 

01001101

77

4D

M

 

01001110

78 

4E

 

01001111

79

4F

O

 

01010000

80 

50

 

01010001

81

51

Q

 

01010010

82

52 

R

 

01010011

83

53

S

 

01010100

84 

54

 

01010101

85 

55 

U

 

01010110

86 

56

 

01010111

87 

57

W

 

01011000

88 

58

 

01011001

89

59 

Y

 

01011010

90 

5A

 

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

 

01100011

99 

63

 

01100100

100

64

d

 

01100101

101 

65

 

01100110

102 

66

f

 

01100111

103 

67

 

01101000

104 

68 

h

 

01101001

105 

69

 

01101010

106

6A

j

 

01101011

107 

6B

 

01101100

108 

6C 

l

 

01101101

109 

6D 

m

 

01101110

110

6E

n

 

01101111

111 

6F

 

01110000

112 

70 

p

 

01110001

113 

71

 

01110010

114 

72 

r

 

01110011

115 

73

 

01110100

116 

74 

t

 

01110101

117 

75 

u

 

01110110

118 

76

v

 

01110111

119 

77

 

01111000

120 

78

x

 

01111001

121 

79

 

01111010

122 

7A 

z

 

01111011

123 

7B

{

 

01111100

124 

7C

|

 

01111101

125 

7D

}

 

01111110

126 

7E 

~

 

01111111

127 

7F 

DEL (delete)

删除 

 

 

posted @ 2016-07-30 16:41  Mr_Blug  阅读(556)  评论(0编辑  收藏  举报