汇编指令:有机器码与其一一对应。
伪指令:没有对应的机器码,最终不被cpu所执行,是由编译器来执行的。
定义段
segment和ends是一对成对使用的伪指令,在写可被编译器编译的汇编程序时,必须要用到这对指令。它们的功能是定义一个段,segment说明一个段的开始,ends说明一个段的结束。使用格式为:
段名 segment
段名 ends
一个汇编程序由一个或多个段组成,这些段用来存放代码、数据或当作栈空间使用。
end伪指令
end是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end就结束对源程序的编译。
assume伪指令
assume的意思是假设。
它假设某一段寄存器和程序中的某一个用segment和ends定义的段相关联。这样cpu可以知道这段代码是数据还是指令。
标号
一个标号标号指代了一个地址。程序中定义的段名最终将被编译、连接程序处理为一个段的段地址,这个地址就是标号。
程序的返回
DOS系统是单任务系统,同一时刻只能有一个进程在运行。如果要运行a程序,则需要一个正在运行的程序b将cpu控制权交给a程序,a程序运行完后再将cpu控制权返还给b程序,这个返还控制权的过程就是程序返回。要实现这个功能,需要在程序的末尾添加一段程序:
mov ax,4c00H
int 21H
实例代码
运算2^3^:
assume cs:code
code segment
start: mov ax,2 ;start代表程序入口,可以任意命名
add ax,ax
add ax,ax
mov ax,4c00H
int 21H ;在debug中调试时这一步用p指令执行
code ends
end start
上述代码经过masm编译、连接之后可以生成一个可运行的exe文件。
exe程序的加载过程
- 先找到一段起始地址为SA:0000的容量足够的空闲内存区;
- 在这段内存区的前256个字节中,创建一个称为程序的前缀(PSP)的数据区,Dos要利用PSP来和被加载的程序进行通信;
- 从这段内存区的256字节处开始(PSP后面),将程序装入,程序的地址被设置为SA+10H:0;
- 将该内存的段地址存入DS中,初始化其它相关寄存器后,设置CS:IP指向程序的入口。