汇编语言知识点总结之四:第四章《第1个程序》

现在我们将开始编写完整的汇编语言程序,用编译器将它们编译成为可执行文件(如:*.exe文件),在操作系统中运行。

1、一个源程序从写出到执行的过程

一个汇编语言程序从写出到最终执行的简要过程:

(1)编写汇编源程序:

使用文本编辑器(如记事本、Notepad++、UltraEdi等),用汇编语言编写汇编源程序。

(2)对源程序进行编译连接:

使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件;

再用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的可执行文件

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

程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)

相关的描述信息(比如:程序有多大、要占多少内存空间等)

(3)执行可执行文件中的程序:

在操作系统中,执行可执行文件中的程序。

操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。

2、源程序

程序4.1(一段简单的汇编语言的源程序)

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

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

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

伪指令:segment……ends 和 end 和assume

(1)定义一个段:

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

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

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

段名 segment
……
……
……
段名 ends

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

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

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

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

(3)assume 假设

它假设某一段寄存器和程序中的某一个用 segment … ends 定义的段相关联。通过assume说明这种关联,在需要的情况下 ,编译程序可以将段寄存器和某一个具体的段相联系。

源程序中的“程序”:

汇编源程序:

  • 伪指令    (编译器处理)
  • 汇编指令(编译为机器码)

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

我们可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行处理的指令或数据 ,成为程序。程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。

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

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

程序的结构:

任务:编程计算2^3。源程序应该怎样来写呢?

(1)定义一个段:

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)段与段寄存器关联

abc被当作代码段来用,所以,我们应该将abc和cs联系起来。

assume cs:abc
abc segment
    mov ax,2
    add ax,ax
    add ax,ax
abc ends
end

最终,完整程序如下:

assume cs:abc
abc segment

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

abc ends
end

程序返回:

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

DOS中的程序运行:

DOS是一个单任务操作系统。

  • 一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。P2开始运行后,P1暂停运行。
  • 而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。

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

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

mov ax,4c00H

int 21H

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

段结束、程序结束、程序返回!

语法错误和逻辑错误

  • 语法错误:程序在编译时被编译器发现的错误;容易发现。
  • 逻辑错误:程序在编译时不能表现出来的、在运行时发生的错误;不容易发现。

3、编辑源程序

源程序如下:

assume cs:abc
abc segment
     mov ax,2
     add ax,ax
     add ax,ax

     mov ax,4c00H
     int 21H
abc ends
end 

运用编辑器(notepad++、ultraedit等),编辑程序,然后将程序保存为文件 *.asm。结束对源程序地编辑。

4、编译

将编辑好的后缀为.asm的源程序,进行编译,生成包含机器代码的目标文件

5、连接

在对源程序/.asm进行编译得到目标文件/.obj后,我们需要对目标文件进行连接,从而得到可执行文件/.exe。

上面已经对1.asm进行编译得到1.obj,现在将1.obj连接为1.exe。

连接的作用有以下几个?

  • 当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
  • 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
  • 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这此内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。

强调一下,我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。我们用汇编语言编程,就要用到 :编辑器(Edit)、编译器(masm)、连接器(link)、调试工具(debug)等所有工具,而这些工具都是在操作系统之上运行的程序,所以我们的学习过程必须在操作系统的环境中进行。

6、可执行文件中的程序装入内存并运行的原理

(1)我们在提示符“C:\masm”后面输入可执行文件的名字“1”,按Enter键。

然后正在运行的command,将1.exe中的程序加载入内存;

(2)1.exe中的程序运行;

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

(3)运行结束,返回,再次显示提示符“C:\masm”。

程序运行结束后,返回到command中,CPU继续运行 command.

汇编程序从写出到执行的过程:

7、程序执行过程的跟踪

为了观察程序的运行过程 ,我们可以使用Debug。

Debug 可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU 的控制,这样,我们就可以使用Debug 的相关命令来单步执行程序 ,查看每条指令指令的执行结果。

DOS系统中.EXE文件中的程序的加载过程如下:

总结:

程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;

这个内存区的前256 个字节中存放的是PSP,dos用来和程序进行通信。从 256字节处向后的空间存放的是程序。

所以,我们从ds中可以得到PSP的段地址SA,PSP的偏移地址为 0,则物理地址为SA×16+0

因为PSP占256(100H)字节,所以程序的物理地址是:可用段地址和偏移地址表示为:SA+10:0

  • 用U命令查看一下其他指令:
  • 用T命令担不执行程序中的每一条指令,并观察每条指令的执行结果
  • 到了 int 21,我们要用P命令执行:
  • int 21 执行后,显示“Program terminated normally”,返回到Debug中。
  • 表示程序正常结束。
  • 注意,要使用P命令执行int 21。

需要注意的是,在 DOS 中运行程序时,是command将程序加载入内存;

所以程序运行结束后返回到command中,而在这里是debug 将程序加载入内存,所以程序运行结束后要返回到Debug中。

使用Q命令退出Debug,将返回到command中,因为Debug是由command加载运行的。

我们在 DOS中用 “Debug 1.exe” 运行Debug1.exe进行跟踪时,程序加载的顺序是:command加载DebugDebug加载1.exe

返回的顺序是:从1.exe中的程序返回到Debug,从Debug返回到command

实验3:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值