汇编语言学习笔记4——编写小程序

时间:2021-09-10 09:18:46

汇编指令:有机器码与其一一对应。
伪指令:没有对应的机器码,最终不被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指向程序的入口。