您的位置:首页 > 其它

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

2013-01-07 14:27 399 查看
==============第一个程序,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,忽略中间文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: