zoukankan      html  css  js  c++  java
  • 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)

    删除 

     

     

  • 相关阅读:
    官网英文版学习——RabbitMQ学习笔记(四)Work queues
    官网英文版学习——RabbitMQ学习笔记(三)Hello World!
    官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
    微服务中springboot启动问题
    nodejs-mime类型
    nodejs-mime类型
    const isProduction = process.env.NODE_ENV === 'production'; 作用
    单向绑定
    建立Model
    使用Sequelize
  • 原文地址:https://www.cnblogs.com/mrblug/p/5721234.html
Copyright © 2011-2022 走看看