BeiTown汇编入门教程(1)- 第一个Hello World程序

表示最近项目需要用到汇编,所以没办法,硬着头皮上吧
花了两天时间大概了解了一下汇编的基本原理,现在开始实践阶段
按照程序界的惯例,第一道菜,先上Hello World

IDE之前选择的是RadAsm,但之后发现不适合初学者,特别是16位DOS汇编的初学者,固选择相对较为简单的Masm for windows(以下简称MasmFW)
地址这里就不放了,大家自己度娘去吧

打开MasmFW,点击新建,出现界面如图,代码已经自动生成了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START

简单说明一下这些语句的意思,因为之前完全没搞过汇编,所以说的可能不完全正确,我基本按照C语言方式的去说明吧

1
2
3
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS

简单来说 SEGAMENT 和 ENDS 是一对伪指令,表示定义一个段,使用格式为

段名 SEGAMENT
.
.
段名 ENDS

一个汇编程序有多个段组成,这些段用来存放代码、数据、或栈空间
现在这句的意思基本上就是预定义
我们可以这样用

1
2
3
4
DATAS SEGMENT
;此处输入数据段代码
STR DB 'Hello World!$'
DATAS ENDS

翻译成C语言就是

1
String STR = "Hello World!";

这里的DB是Define Byte即定义字节,$表字符串结尾

之后是这句

1
2
3
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

这是堆栈相关的语法,暂时用不到,先略过,我们接着往下看

1
2
3
4
5
6
7
8
9
10
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START

CODES是代码段名
ASSUME同样是一条伪指令,意思是将几个预写好的段和相应的寄存器关联起来
这里将CODES代码段和CS关联,DATAS,即刚才定义了HelloWorld的那一段与DS关联

接下来看START,与END START对应,意思很直观就不解释了

然后大家需要先了解一下MOV这个指令
类似于C里的赋值语句

即DATAS段里的内容存进AX寄存器,AX再将其获得的内容存入DS,不要问我为什么不能MOV DS,DATAS
这是硬件原因,汇编语言不允许直接对段寄存器进行赋值

接下来是 MOV AH,4CH
INT 21H
这两句死记即可,在程序要结束时使用,简单地说,这是个中断调用指令,目的是告知程序结束返回DOS

解释到这里关于IDE自动生成的代码基本已经阐述完毕,但我们的任务还没完成,之前已经定义好了HelloWorld的STR段
但还没有将它打印出来,打印的汇编语句也很简单,如下

在“;此处输入代码段代码”后面添加

1
2
3
LEA DX,STR
MOV AH,9
INT 21H

LEA目标地址传送指令: 将一个近地址指针写入到指定的寄存器
这里是将一个要输出的字符串地址指针写入DX寄存器

MOV AH,9的意思是调用DOS的9号功能
INT 21H 类似语句执行的意思
这和之前的 MOV AH,4CH是一样的原理

简单说下使用DOS系统功能调用的一般过程:先将调用号放入寄存器AH中,置好入口参数,然后执行软中断语句“INT 21H”.
下面是基本的输入输出系统功能调用。
1号调用:功能是等待从键盘输入一个字符并将输入的字符的ASCII码送入寄存器AL中。同时送显示器显示。
2号调用:将DL中的字符送显示器显示,若DL中为+的ASCII码,则从本调用的执行中退出。
5号调用:将DL中的字符送打印机打印。
8号调用:与1号调用相似,只是不送显示器显示。
9号调用:将当前数据区中DS: DX所指向的以’$'结尾的字符串送显示器显示。
10号调用:从键盘上往DS: DX所指的输入缓冲区输入字符串并送显示器显示。

红色标注的就是程序此次调用的9号功能

翻译成C语言就是

1
printf(%s,STR);

至此,我们汇编的第一个HelloWorld程序就完成了,完整代码如下

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
DATAS SEGMENT

STR DB 'Hello World!$'

DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

MOV AX,DATAS

MOV DS,AX

LEA DX,STR

MOV AH,9

INT 21H

MOV AH,4CH

INT 21H

CODES ENDS

END START

运行效果截图

BeiTown
2012-11-23

本文链接:BeiTown汇编入门教程(1)- 第一个Hello World程序

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , ,

9 Responses to BeiTown汇编入门教程(1)- 第一个Hello World程序

  1. Hi丨猫先生 说道:

    应该是纯机器语言了,不过拿C来学汇编。。亏你想得出,PS:其实我是来试试回复功能的、

  2. Hi丨猫先生 说道:

    回复@北呈:看尾巴,还是没有自己申请KEY的好,用灯鹭的会显示来自社会化登陆平台

  3. BeiTown 北呈 说道:

    回复@Hi丨猫先生:在等审核,先是身份3天以上,然后网站审核又得好几天

  4. Hi丨猫先生 说道:

    回复@北呈: 好吧,相当烦人,6os那边也提交了审核,未审核的居然只允许15人测试绑定,太坑爹了。[鄙视]

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>