汇编学习笔记:第一个程序,Hello World!!!

==============第一个程序,Hello World!!!===========================
编写执行过程:
1:用文本编辑器编写汇编源程序
2:对源程序进行编译连接,使用汇编语言编译程序对源文件中的程序进行编译,产生目标文件。
   再用连接程序对目标程序进行连接,生成可在操作系统中直接运行的可执行文件(.exe)。
3:由操作系统执行可执行文件中的程序


可执行文件包含两部分内容:
1:程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)。
2:相关描述信息(比如,程序有多大,占用多少内存空间等等)


assume cs:codesg // 通过assume语句,把段及要关联的段寄存器进行声明


codesg segment // 声明一个段的开始
	mov ax,0123H
	mov bx,0456H
	add ax,bx
	add ax,ax


	mov ax,4c00H
	int 21H
codesg ends // 声明一个段的结束


end // 程序结束,编译器结束对源程序的编译




源程序的组成:
一.伪指令:汇编源程序中,包含两种指令,一种是汇编指令,一种是伪指令。


汇编指令有对应的机器码,可以被编译为机器指令,最终由CPU执行。
伪指令没有对应的机器码,由编译器来执行伪指令,编译器根据伪指令来进行相关的编译工作。


上面的程序代码中包含三种伪指令
1):codesg segment
   codesg ends
segment和ends是一对成对用的伪指令,功能是定义一个段,segment用于一个段的开始,ends用于一个段的结束。


一个段必须用一个名称来标示,使用格式为:
段名 segment
...
段名 ends


一个汇编程序由多个段组成,这些段被用来存放代码,数据或当做栈空间来使用。
一个源程序中所有被计算机所处理的信息:指令、数据、栈,被划分了不同的段中。


2):end
end是一个汇编程序的技术标记,编译器在编译汇编源程序过程中,如果碰到了伪指令end,就结束对源程序的编译。


3):assume
伪指令assume详细解释:
1:assume的作用仅仅是告诉编译器,我碰到一个标号,要计算它的物理地址的时候,从哪一个段寄存器里面取出段值,
至于这个段寄存器的值对不对,那它就不管了,这是程序员的事情,反正它只管根据assume里面的设定来用段寄存器,
所以,对于程序员来说,不仅要用assume告诉编译器计算物理地址的时候要从哪一个段寄存器取值,而且要在指令中明确的把对应段的段值送到设定好的段寄存器中。 
2:该命令用来通知汇编程序,CS、DS、SS、ES将被设定为哪些段的段基址寄存器,从而在汇编时能够知道,语句中引用的变量或标号是通过哪些寄存器进行访问的。
3:是指明变量与段寄存器的联系,比如assume ds:data,
它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址,但是它不对程序作任何事,比如你必须自己对ds赋值


二.源程序中的程序
源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行,处理的指令或数据称为程序。


三.标号
除了汇编指令和伪指令外,还有一些标号,比如codesg,一个标号指代了一个地址。
比如codesg在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。


四.程序的结构
计算2^3:
1): 定义一个段,名称为abc
abc segment
abc ends


2):在这段中写入汇编指令,实现我们的任务
abc segment
  mov ax,2
  add ax,ax
  add ax,ax
abc ends


3):然后,要指出程序在何处结束
abc segment
  mov ax,2
  add ax,ax
  add ax,ax
abc ends


end


4):与相应的段寄存器相关联
assume cs:abc


abc segment
  mov ax,2
  add ax,ax
  add ax,ax
abc ends


end


五.程序返回
一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为程序返回。
所以,我们在程序的末尾添加返回的程序段
mov ax 4c00H
int 21H
这两条指令所实现的功能就是程序返回。


编译源程序:


将源程序文件保存为filename.asm。
1.进入dos,进入编译器所在目录,c:\masm,运行masm.exe
2.然后提示输入被编译的源程序文件的名称,然后按回车键。
3.程序提示我们输入要编译出的目标文件的名称,这里直接按回车,使用它默认提供的.obj文件名。
4.程序提示输入列表文件的名称,直接Enter即可。
5.程序提示输入交叉引用文件的名称,直接Enter即可。




编译结束,编译过程中,我们提供了一个输入,即源程序文件,
最多可以得到三个输出:目标文件(.obj)、列表文件(.lst)、交叉引用文件(.crf)。这三个文件中,目标文件使我们最终想要的结果,另外两个只是中间文件,可以让编译器忽略对它们的生成,直接Enter。


连接:


在对源程序进行编译得到目标文件后,我们需要对目标文件(.obj)进行连接,从而得到可执行文件(.exe)。
1.进入dos,进入编译器所在目录,c:\masm,运行link.exe
2.提示输入要被连接的目标文件的名称,然后按回车键。
3.提示输入要生成可执行文件的名称,使用默认提供的名称即可,直接按回车键。
4.提示输入映像文件的名称,属于连接可执行文件过程中的中间文件,可以忽略不生成,直接Enter。
5.提示输入库文件的名称,库文件中包含了一些可被调用的子程序,如果程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和目标文件连接到一起,生成可执行文件,但是这个程序没有调用任何子程序,直接忽略Enter即可。


以简化的方式进行编译和连接:
进入dos,进入编译器所在目录,c:\masm
输入:masm c:\1;  结尾加分号,这样直接生成目标文件,忽略中间文件。
link 1; 直接生成可执行文件1.exe,忽略中间文件。
posted @ 2013-01-07 14:27  java程序员填空  阅读(248)  评论(0编辑  收藏  举报