汇编语言---------王爽第4章

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

一个源程序从写出到执行的过程分为三步:

  1. 编写汇编源程序
  2. 对源程序进行编译连接
  3. 执行可执行文件中的程序
    在操作系统按照可执行文件中的描述信息,将可执行文件中的机器码和数据加载内存,并进行相关的初始化。比如设置CS:IP指向第一条要执行的指令。
    下面是一段简单的汇编语言源程序。
assume cs:codesg
codesg segment
			mov ax,0123H
			mov bx,0456H
			add ax,bx
			add ax,ax
			mov ax,4c00H
			int		21H
codesg ends
end

1.伪指令
在汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应的机器码的指令,可以被编译为机器指令,最 终为CPU所执行。而伪指令没有对应的机器指令,最终不被CPU所执行。伪指令是由编译器来执行的指令。编译器根据伪指令来进行相关的编译工作。
上面的源程序出现了3种为指令
XXX segment
XXX ends

segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时必须要用到的一对伪指令,segment说明一个段开始,end是说明一个段的结束。一个段必须有一个名称来标识,使用格式为:
段名 segment

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

end

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

assume

这条伪指令的含义为假设,我们并不需要深入理解这条指令的作用,我们只需要记住assume将有特定用途的段和相关的段寄存器关联起来就行。比如上面的程序我们用 codesg segment… codesg ends定义了一个名为codesg的段,这是个代码段,所以在程序的开头我们用assume cs:codesg将代码段的段地址和CPU中的CS联系起来。

标号

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

程序的运行机制

我们的程序最先以汇编指令的形式存在源程序中,进编译、连接后转变为机器码,存放在可执行文件中。
一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存中,将CPU的控制权交给P2,P2才得以运行。P2开始运行后,P1暂停运行,而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1。
现在我们知道了这个交还CPU控制权给使它得以运行的程序叫做:程序返回。在汇编语言中我们以下两句指令实现程序返回。

mov ax,4c00H
int 21h

与结束相关的概念

目的 相关指令 指令性质 指令执行者
通知编译器一个段的结束 段名 ends 伪指令 编译时,由编译器执行
通知编译器程序结束 end 伪指令 编译时,由编译器执行
程序返回 mov ax,4c00H int 21H 汇编指令 执行时,由CPU执行

写汇编程序

编辑源程序

我们可以通过很多种方式来编辑源程序,比如txt文本文件或者其他编辑器多可用来编辑源程序,这里我用的是notepad++。

编译源程序

编译和编辑看起来很像其实是两个概念,编辑是写源程序,编译是将源程序翻译成目标代码。这里我们可以用微软提供的masm软件具体如何在win10下编写汇编语言并运行我会在文章后面贴出网址有需要的可以自己去看。

链接

编译源程序后产生的文件是XXX.obj这并不是最终可以执行的可执行文件,必须要进行链接的步骤。链接是将其他源程序,或你源程序中用到其他库的子程序连接起来,最终产生可执行文件的过程。
如何在WIN10下实现以上的步骤起看这个连接 网址:Windows10搭建汇编环境——详细步骤

猜你喜欢

转载自blog.csdn.net/weixin_47617598/article/details/115016589