五、程序的编写与执行

五、程序的编写与执行

汇编语言程序写出到执行的过程: 写出源程序—>对源程序进行编译连接—>生成可执行文件—>操作系统将其加载入内存—>CPU执行程序

1.源程序

源程序包括汇编语言和伪指令。
示例:

伪指令

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

(1) segment与ends

作用:定义一个段。
segment 表示一个段的开始,ends 表示一个段的结束。

用法:

段名 segment

段名 ends

(2) end

作用:结束编译。
PS: 注意区分end与ends的含义。

用法:在程序结尾处使用。

(3) assume

作用:将段与指定的段寄存器关联起来。(即声明该段在CPU中的执行位置)

用法:在一个段的开头使用。

assume 段寄存器:段名

(4) 标号

一个标号指代了一个段地址。
它被编译后最终处理为一个段地址。

程序与程序结构

程序返回

(1)DOS中的程序运行

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

当要运行XXX.exe程序时,DOS程序会终止运行,CPU将控制权移交给此exe程序,程序运行完成后,会返回DOS程序继续运行,等待下一条指令的输入。

我们称这个过程为程序返回

原理详见CSAPP中对于进程与线程的阐述。

(2) 实现程序返回(中断机制)

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

mov ax,4c00H
int 21H

PS: 这是汇编指令,由CPU负责执行。

小结:

逻辑错误与语法错误

被编译器发现的错误是语法错误;编译后,在运行时发生的错误是逻辑错误。
一个是语句错误书写,一个是缺少必要语句或者本身的逻辑问题

2.环境配置

(1)下载Notepad++(用于编写源程序,用其他文本软件也可以)
(2)下载MASM,并将这几个程序与源程序文件放在一起
(3)在Notepad++上编写源程序并保存到上述的文件夹中

3.源程序的编译、连接与执行

(1)如源程序的示例那样编写好源程序后,我们就可以将其保存为一个XXX.asm的文件,然后进入DOSBox程序,输入以下命令以打开源程序文件所在位置:

mount c D:\StudyAssembler\MASM\ (文件所在位置)
C:

如图所示:

(2)输入以下命令以编译源程序:

masm 1.asm

如下图所示:

(3)编译完成后会生成一个1.obj对象文件,输入以下命令以连接程序:

link 1.obj

由于书本中的1.asm文件只有一个代码段,所以无需作其他配置,接下来一直回车直到出现命令行的出现。

如下图所示:

(4)输入“1.exe”运行程序,会看到一个短暂的黑屏,然后回到DOS命令行,程序运行完毕。

至此,我们完成了1.asm文件的编译、连接和运行,但是,我们并没有看到运行程序的过程。

PS:

  • XXX.com文件大小为64KB,只能有一个段。
    XXX.exe文件可以很大,其中一般有多个段。
    所以当你编写的程序中只有一个段,可以考虑使用XXX.com文件执行,可以用于伪装。
  • 可以用“ML 1.asm”指令来编译并连接程序,并且文件后缀和文件名有时可省略,因为已默认文件位置和类型。
  • 可以指定文件生成的位置,只需在执行文件前加上路径
  • Link的作用:可以将源程序分开编译,然后将它们连在一起
  • 在命令行输入指令后加分号,可以使编译器忽略中间文件的生成,更简捷

4.对于DOS程序运行原理的解释

(1)任何通用系统都要提供shell(外壳)程序,用户使用此程序来操作计算机系统进行工作。
(2)DOS中有一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell。
(3)DOS启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他的相关任务后,在屏幕上显示出由当前盘符和当前路径组成的提示符,比如:“c:\”或“c:\windows”等,然后等待用户的输入。
(4)command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,command暂停运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。在DOS中,command处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。

故汇编程序的完整执行过程为:
编程 (Edit) 一>l.asm一>编译(masm)一>1.obj一>连接(link)一>1.exe一>加载 (command) 一>内存中的程序一>运行(CPU)

5.跟踪程序的执行

在源程序的汇编指令前加标号(对段命名),并在end后加上这个标号,就给程序设置了一个入口。
Debug利用中断指令实现对程序的跟踪。
CX中存放程序的长度。

上图说明内存中程序存放在DS地址+10H(即256字节)处,这256字节里存放着PSP,DOS用来和程序通信。
故程序的物理地址为:(X+16)x16+0 (左移一格)
可用段地址和偏移地址:X+10H:0

Debug的执行原理:command加载Debug,Debug加载1.exe。程序结束后从1.exe中的程序返回到Debug,从Debug返回到command。


五、程序的编写与执行
http://example.com/2023/08/01/汇编语言/五、程序的编写与执行/
作者
Jwj-Learning
发布于
2023年8月1日
许可协议