表示最近项目需要用到汇编,所以没办法,硬着头皮上吧
花了两天时间大概了解了一下汇编的基本原理,现在开始实践阶段
按照程序界的惯例,第一道菜,先上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 |
至此,我们汇编的第一个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
Tags: BeiTown, Hello World, 汇编
应该是纯机器语言了,不过拿C来学汇编。。亏你想得出,PS:其实我是来试试回复功能的、
这功能还是比较好用的~[ali哇]
回复@拾六:网站在维护中,机器码发我一下吧
flywin网站登录不上啊没法弄注册码
回复@拾六:激活码E181B83BCF70E0C0480011502BDBB507
回复@北呈:0CF789D8CE9BF51852C250897A5559B7
回复@北呈:看尾巴,还是没有自己申请KEY的好,用灯鹭的会显示来自社会化登陆平台
回复@Hi丨猫先生:在等审核,先是身份3天以上,然后网站审核又得好几天
回复@北呈: 好吧,相当烦人,6os那边也提交了审核,未审核的居然只允许15人测试绑定,太坑爹了。[鄙视]