首页 > temp > 简明python教程 >
-
8086汇编语言入门-HelloWorld
附件下载:
http://pan.baidu.com/s/1i5R9qO9 密码:rfgk
80x86微处理器汇编语言编程。学习任何编程语言都免不了要跨越HelloWorld这道坎,面向机器的汇编语言与面向过程/对象的高级语言不同,编码过程中对寄存器、内存的分配等细节都需要编程人员去关心;而高级语言程序如C语言、C++,即使你不知道printf具体是怎么实现的,只要掌握使用方法即可(封装成模块)。C语言的helloworld程序简单到只有一行执行语句:
printf("Hello,World!"); //在屏幕缓冲区中显示"Hello,World!"一串字符
而汇编语言的Helloworld,同样很简洁,却让很多初学者摸不到头脑;打一个简单比喻,上面的printf(.....)就好比一把手枪,字符串"Hello,World!"好比子弹,给printf装上“子弹”就能完成射击的功能。当然你也可以更换其他子弹.....汇编语言要实现往屏幕缓冲区输出字符串并显示,所需做的工作就没有这么直观容易理解了。 汇编语言编程,面向的是“寄存器”,寄存器是计算机CPU内部的一种超高速缓存(速度胜过内存数倍,但容量极小),对数据的各种操作都由“指令”来进行,也被称作汇编指令,比如ADD AX,BX 意思是将寄存器AX与BX的值相加,结果存放到AX;AX/BX都属于8086通用数据寄存器。更多汇编知识将在以后篇幅中讲解。
hello.asm 源程序
1 ;80x86汇编语言<入门程序> 2 ;YPP.20170928 3 ;文件名Hello.asm 4 5 DSEG SEGMENT 6 MESS DB 'Hello,World!' ,0DH,0AH,24H 7 DSEG ENDS 8 9 SSEG SEGMENT PARA STACK 10 DW 256 DUP(?) 11 SSEG ENDS 12 13 CSEG SEGMENT 14 ASSUME CS:CSEG,DS:DSEG 15 BEGIN: MOV AX,DSEG 16 MOV DS,AX 17 MOV DX,OFFSET MESS 18 MOV AH,9 19 20 INT 21H 21 MOV AH,4CH 22 INT 21H 23 CSEG ENDS 24 END BEGIN 25
初学者首先需要知道的是,汇编语言程序由两个基本元素组成:操作码、操作数
操作码,指明要进行的操作,如加、减、乘、除....
操作数,被操作的对象,可以是数字、字符串、存储单元(变量)等
本文不对代码细节做过多的解释,因为需要很多前置知识做铺垫,才能更好的理解这段代码。
前置知识包括,二进制数制换算、CPU内存单元寻址、14个16位寄存器组、存储器分段、中断机制等等
上面的代码编辑或复制到记事本中,另存为.asm文件,这是汇编语言的源代码文件,中间要进行汇编的操作,生成的.obj文件是目标文件,经过链接之后,才能形成最终的可执行文件.exe,整个过程与高级语言的运行过程是大致相仿的。
工具有很多,但还是推荐经典的Masm5.0,
注:编写80x86平台的汇编语言,不要在Win-Vista\7\8.1\10的系统上操作,因为16位程序会出现兼容性问题。
本文均在Windows XP sp3操作系统上编辑、汇编、链接、运行.
Masm5.0下载:http://pan.baidu.com/s/1hsjCcRi 密码:syqo
masm无需安装,解压到某磁盘根目录下,进入DOS操作
Win+R输入CMD进入DOS,先用DOS命令进入MASM5.0文件目录下,同时hello.asm源文件也要复制到同一路径下。
汇编命令格式> masm xxx.asm 回车 注:DOS下不区分大小写
连续回车,表示使用默认文件名,四个回车下来,会生成Hello.obj文件;如果出现错误应当更改源文件后重新汇编,
0 Warning Errors.....表示没有错误。
没有错误后,下一步进行“Link”链接,命令格式>link xxx
注:链接时要指定文件名,就是刚刚生成的Hello.obj 可以省略后缀,名字不要省略!不然会报错
link hello 回车 三次回车后,正常情况下会生成Hello.exe 那也就是程序的最终形态,直接输入hello就运行了这个程序(不要双击运行,不然DOS窗口一闪而过看不到执行结果)
HelloWorld字符串被成功输出出来,这个程序也就完成了
源文件Hello.asm——>目标文件Hello.obj——>可执行文件Hello.exe
这就是整个过程。
另外补充一点,由asm到obj在汇编语言中,这个过程叫做“汇编Assembly”;在高级语言中叫做“编译Compile”
有的教程中会缺少堆栈段SSEG,没有堆栈段 在masm中也会报错,会提示no stack segment要注意。