一个源程序从写出到执行的过程
1)编写汇编程序。
2)对源程序进行编译链接,生成可执行文件。
3)执行可执行文件中的程序。
assume cs:codesg //假设 codesg是个代码段,所以将codesg和CPU的段寄存器cs联系起来。
codesg segment //segment 伪指令:定义一个段,段的名称为codesg,这个段从此开始
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H //返回的程序段
int 21H
codesg ends //ends 伪指令:名称为codesg的段到此结束
end
伪指令是由编译器来执行的命令,编译器根据伪指令来进行相关的编译工作。
segment和ends
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。
segment 和 ends 的功能时定义一个段,segment 说明一个段开始,ends说明一个段结束。一个段必须有一个名称来标识,使用格式为:
段名 segment
.
.
段名 ends
一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。一个源程序中所有将被计算机所处理的信息:指令、数据、栈,被划分到了不同的段中。
一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
end
end 是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。程序写完了,要在结尾处加上伪指令 end。否则,编译器在编译程序时,无法知道程序在何处结束。
end的作用是标记整个程序的结束。
assume
assume伪指令的含义为“假设”。他假设某一段寄存器和程序中的某一个用segment..ends定义的段相关联。
asssume cs:codesg //假设 codesg是个代码段,所以将codesg和CPU的段寄存器cs联系起来。
assume将有特定用途的段和相关的段寄存器关联起来。
格式:
assume 段寄存器:要关联的segment..ends定义的段
源程序中的“程序”
用汇编语言写的源程序,包括伪指令和汇编指令,我们编程的最终目的是让计算机完成一定的任务。源程序中的汇编指令组成了最终由计算机执行的程序,而源程序中的伪指令是由编译器来处理的,它们并不实现我们编程的最终目的。这里所说的程序就是指源程序中最终由计算机执行、处理的指令或数据。
以后可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行、处理的指令或数据,称为程序。程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。
标号
一个标号指代了一个地址。比如“codesg”就是一个标号。codesg在segment的前面,作为一个段的名称,这个段的名称最终将被编译、链接程序处理为一个段的地址。
程序的结构
源程序是由一些段构成的。我们可以在这些段中存放代码、数据、或将某个段当作栈空间。
任务:编程运算2^3。
1)定义一个段,名称为abc。
abc segment
.
.
abc ends
2)在段中写入汇编指令实现功能,并指出程序在何处结束。
abc segment
mov ax, 2
add ax, ax
add ax, ax
abc ends
end
3)abc被当作代码段来用,所以,应该将abc和cs联系起来。(完成)
assume cs:abc
abc segment
mov ax, 2
add ax, ax
add ax, ax
abc ends
end
程序返回
一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。P2开始运行后,P1暂停运行。当P2运行完毕后,应该将CPU的控制权交还给使他得以运行的程序P1,此后,P1继续运行。(单任务操作系统)
一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。
如何返回呢?应该在程序的末尾加上返回的程序段。
前面程序的程序返回指令:
mov ax, 4c00H
int 21H
实现了程序返回功能。
通知编译器一个段结束 段名 ends 伪指令 编译时,由编译器执行
通知编译器程序结束 end 伪指令 编译时 由编译器执行
程序返回 mov ax, 4c00H int 21H 汇编指令 执行时,由CPU执行