汇编语言03——第一个汇编程序

来源:互联网 发布:python课程推荐 编辑:程序博客网 时间:2024/06/05 07:58

整理自鱼C论坛课件


汇编程序编写步骤


编写源代码->使用MASM.exe进行编译,产生目标文件->用LINK.exe,对目标文件进行链接,生成可执行文件


可执行文件中包含两部分内容

1,程序和数据

2,相关的描述信息(程序有多大,要占用多少内存空间等)


源程序:

assume cs:abc

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

mov ax,4c00H
int 21H
abc ends
end

汇编指令:

有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。

源程序中:

mov ax,2
add ax,ax
add ax,ax

mov ax,4c00H
int 21H

 为汇编指令,会被编译为机器指令


伪指令

没有对应的机器码的指令,最终不被CPU所执行。

伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。

定义一个段

segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。

segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。

一个段必须有一个名称来标识,使用格式为:

段名 segment

… …

段名 ends

一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。

一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。

 

end才是真正的没了

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

如果程序写完了,要在结尾处加上伪指令end 。否则,编译器在编译程序时,无法知道程序在何处结束。

切记:不要搞混了end和ends。

 

寄存器与段的关联假设

 

assume:含义为“假设”。

它假设某一段寄存器和程序中的某一个用 segment … ends 定义的段相关联。

通过assume说明这种关联,在需要的情况下 ,编译程序可以将段寄存器和某一个具体的段相联系。

 

汇编源程序:

伪指令 (编译器处理)

汇编指令(编译为机器码)

程序:源程序中最终由计算机执行、处理的指令或数据。

 

注意

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

程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。

请看图!

程序经编译连接后变为机器码

源程序:


标号:

一个标号指代了一个地址。

codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。


程序返回

我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?

 

DOS中的程序运行

DOS是一个单任务操作系统。一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。

P2开始运行后,P1暂停运行。而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。

现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。


最后如何返回呢?

应该在程序的末尾添加返回的程序段。

mov ax,4c00H

int 21H

这两条指令所实现的功能就是程序返回。


知识扩充:

操作系统的外壳

操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。

DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。

(1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。

(2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。

(3)程序运行结束后,返回到command中,CPU继续运行command。



关于如何在64位操作系统上进行编译链接:

首先,需要下载debug.exe,DOSbox,masm

假如汇编源文件放在:D:\Develop\ASM_Program\first_asm\下,文件名为1.asm

下载一个masm6.15,将MASM.EXE,LINK.EXE,ML.EXE三个文件复制到1.asm目录中,

1.asm内容:(求2^3)

assume cs:abc

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

mov ax,4c00H
int 21H
abc ends
end


win+R,输入cmd

进入命令行,输入

C:\Users\Administrator>D:
D:\>cd Develop\ASM_Program\first_asm

至此,进入了源程序所在目录,之后,输入:
D:\Develop\ASM_Program\first_asm>masm 1.asm

会显示:
Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1993.  All rights reserved.


 Invoking: ML.EXE /I. /Zm /c /Ta 1.asm


Microsoft (R) Macro Assembler Version 6.15.8803
        Patched for you by promethee [ECL] in the year 2001 - enjoy
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.


 Assembling: 1.asm


D:\Develop\ASM_Program\first_asm>

这样,程序就被编译好了,在1.asm文件夹下出现了一个1.obj的文件

之后,再输入:

link 1.obj之后回车

会显示链接信息:

Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.


Run File [1.exe]: //显示这个之后需要按下回车之后才出现下一行
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
LINK : warning L4038: program has no starting address

这样,就生成了1.exe文件,即可执行文件

但是由于操作系统是64位的,不能直接运行这个文件,所以,需要使用DOSbox进行运行

我们先把下载下来的debug.exe也放到D:\Develop\ASM_Program\first_asm下面

打开DOSbox,输入:

mount c d:\Develop\ASM_Program\first_asm\

之后,输入c:

然后输入debug 1.exe

就使用debug打开了1.exe了

可以输入r命令查看当前寄存器的状态,在我的机器上状态如下:


CX寄存器中记录了程序的大小

输入t命令进行单步执行

注意,执行到最后一句int 21时,要使用p命令执行

0 0
原创粉丝点击