一个汇编语言程序
codesg segment
st: mov ax,0123h mov bx,0456h add ax,bx add ax,ax
mov ax,4c00
int 21h
codesg ends
end st
; end命令除了通知编译器程序结束外,还可以通知编译器程序入口在什么地方。 ; 如上述的 end st,st就是一个入口说明符
涉及到的一些知识:
- segment
xxx segment ;code … xxx ends
- segment和ends是一对伪指令关键字,用来定义一个段。
- 一个汇编程序是由多个段组成的,这些段被用来存放代码、数据、或者当作栈空间来使用。一个有意义的汇编程序至少要有一个段,用来存放代码。
- end
- end汇编语言的结束标记。在编译过程中,如果遇到end指令,就结束编译
- assume
- assume 假设,假设某一个段寄存器和程序中的一个段关联。
- 可以理解为用来将特定用途的段和相关寄存器关联起来
- 标号(codesg)
- 一个标号代表一个地址
- 程序返回mov ax,4c00 int 21
- 暂时记住这两条指令代表程序返回
注:在Debug中,最后的int 21指令要使用P命令执行。
<a name="sPo66"></a>
## 编译和连接方法
<br />注:编译器只能发现语法错误而无法发现逻辑错误。
CPU执行一个程序,需要有另一个程序将它加载进内存(即将CS:IP指向它),一般情况下我们通过DOS执行这个.exe,所以是DOS程序将它加载进入内存。当这个程序运行结束,再返回DOS程序继续执行。如果是DOS调用Debug调用.exe,那么先返回Debug再返回DOS。
DOS加载一个.exe时,先在内存中找到一段内存,起始段地址SA,然后分配256字节的PSP区域,用来和被加载程序通信。在之后的段地址SA+10就是程序开始的段地址。CS:IP指向它,DS=SA。
<a name="wRvcG"></a>
## 程序结构
汇编程序的几个基本要素和简单框架如下:
1. 首先是要定义一个段,如abc。并在段中写入指令和数据
abc segment ; code … abc ends ```
- 用end关键词来指定结束位置
- 将段和指定的段寄存器绑定起来