我们可以使用伪指令 PROC 和 ENDP 为一个程序片段定义一个标记,叫做一个过程 (procedure) 。对于 Philips 80C51MX 和 Intel/Atmel WM 251 架构,一个过程既可以是 NEAR 型,也可以是 FAR 型。过程的类型不同,调用指令也不同,对于 NEAR 型使用 LCALL 或 ACALL,对于 FAR型使用 ECALL。不象 C 函数,汇编器过程不为标记提供局部范围。因为可视范围是整个模块,所以 A251 中的标识符必须唯一。伪指令 PROC/ENDP 的格式如下:
| name | PROC [ type ] |
| ; procedure text (过程代码) | |
| : | |
| : | |
| RET | |
| name | ENDP |
其中
| name | 是过程的名称。 |
| type | 指明过程的类型,过程的类型必须是下表中类型之一: |
| 类型 | 说明 |
| none | 默认为 NEAR 型 |
| NEAR | 定义一个 near 型过程;由指令 LCALL 或 ACALL 调用。 |
| FAR | 定义一个 far 型过程;由指令 ECALL 调用。 |
如果我们要从另外一个 64K 字节段中调用该过程,我们应该把它指明为 FAR 型。过程通常以指令 RET 结尾。软件指令 RET 将自动被转换为一条适当的机器返回指令。例如:
| RET | 从一个 near 型过程中返回。 |
| ERET | 从一个 far 型过程中返回。 |
例程:
| P100 | PROC | NEAR | |
| RET | ; near 型返回 | ||
| ENDP | |||
| P200 | PROC | FAR | |
| RET | ; far 型返回 | ||
| ENDP | |||
| P300 | PROC | NEAR | |
| CALL | P100 | ; LCALL | |
| CALL | P200 | ; ECALL | |
| RET | ; near 型返回 | ||
| ENDP | |||
| END |
