第四章总结

这章我们主要讲如何写和编译一个汇编程序。

1汇编程序组成

一个汇编源程序由两种指令组成,一种是汇编指令,一种是伪指令。

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

伪指令是没有对应的机器指令,最终不为CPU执行,而由编译器执行,编译器根据伪指令来进行相关的编译工作。

下面结合书上的例子进行说明:

assume cs:codesg       ;通过assume将用作代码段的codesg和CPU的段寄存器CS联系起来,assume的作用是把寄存器和具体的段联系起来

codesg segment        ;定义一个段,其中codesg是端标识(名称)

  mov ax,0123H

  mov bx,0456H

  add ax,bx

  add ax,ax

  mov ax,4c00H        ;程序返回

  int 21H         ;程序返回

codesg ends          ;结束这个段

end              ;汇编程序结束的标记

注意:1,区别ends和end的区别:end是汇编程序的结束,ends是段的结束标记

2在源代码中除了汇编指令和伪指令,还有标号,如此例中的codesg,指代了一个地址,作为段的名称,这个名称最终被编译,连接程序处理为段的段地址。

程序返回:将CPU的控制权交还给使得它得以运行的程序

所用到的代码为:

  mov ax,4c00H

  int 21H

语法错误:程序在编译时被编译器发现的错误是语法错误。

逻辑错误则不能被编译器发现,因此更不容易被发现。

2编译一个汇编程序

在dos环境下使用masm工具编译。用法是

masm 文件名[.asm]

如果文件是以asm为拓展名,那么可以不加拓展名,否则一定要加拓展名。

我们不妨忽略中间列表文件和交叉引用文件的生成,然后通过

link 文件名.obj

连接产生可执行文件。

然后就可以直接输入可执行文件名执行了。

注意:1如果我们在这两个命令结束的地方加上“;”那么就会以简化的方式生成文件。

 2我们也可以通过debug命令来调试这个程序,debug用法在前面的实验中已经提过,这里不多赘述。(单步调试到int 21h这条命令时,使用p命令调试)

在DOS环境下,我们运行一个程序,就是其他程序将CPU的控制权交给这个程序,所以当这个程序执行完毕以后要将CPU的控制权交还给原程序。

因此当调用一个程序开辟内存空间时,该区域前256个内存单元为PSP数据区,也就是ds指向的位置,而cs=ds+10H,也就是说从cs处才是程序的字节码。

也就是书上说的:PSP区和程序区虽然物理地址连续,却有不同的段地址。 psp数据区(段前缀)是操作系统在执行程序时为程序所建立的一个信息块,里面包括了传递给待运行程序的命令行参数,   程序运行结束时返回DOS所需的地址等有用的信息。

原文地址:https://www.cnblogs.com/asm085/p/9909253.html