(3) STACK堆栈→将同段名,同类名的段顺序相拼, 不留空隙,长度相加,构成堆栈段。一个程序模块 中至少有一个段为 STACK组合方式的段。 (4) COMMON公用→将同名段,同类别名的段相 互覆盖,长度取决于最长的段。 (5)AT表达式→段地址为表达式的值。 (6) MEMORY→表示将本段定位在其他段的上面 (即最高地址)。 类别名→用单引号括起来的字符串,连接时将同 类别名的所有段(段名可不同)存放在连续的存 储区。单模块程序可省略类别名
(3)STACK堆栈→将同段名,同类名的段顺序相拼, 不留空隙,长度相加,构成堆栈段。一个程序模块 中至少有一个段为STACK组合方式的段。 (4)COMMON公用→将同名段,同类别名的段相 互覆盖,长度取决于最长的段。 (5)AT表达式→段地址为表达式的值。 (6)MEMORY→表示将本段定位在其他段的上面 (即最高地址)。 • 类别名→用单引号括起来的字符串,连接时将同 类别名的所有段(段名可不同)存放在连续的存 储区。单模块程序可省略类别名
2、假定伪指令 格式: ASSUME<段寄存器:段名〉, 功能:告诉汇编程序各段名与段寄存器的对应 关系,一般在代码段中。 因为,存储器分段管理,程序中的存储单元用逻 辑地址的偏移地址来寻址,而段地址一般默认, 所以,代码段一开始就要对段寄存器与段之间的 关系做假定
2、假定伪指令 格式:ASSUME〈段寄存器:段名〉,…… 功能:告诉汇编程序各段名与段寄存器的对应 关系,一般在代码段中。 因为,存储器分段管理,程序中的存储单元用逻 辑地址的偏移地址来寻址,而段地址一般默认, 所以,代码段一开始就要对段 寄存器与段之间的 关系做假定
3、源程序结束伪指令 格式:END[表达式] 功能:源程序的最后一个语句,标志整个程序结 束,即告诉汇编程序,汇编到此结束。 表达式→为可选项,必须是存储器地址,即 程序的启动地址,常为标号。 不带表达式的END结束的模块不能单独运行, 为子模快
3、源程序结束伪指令 格式:END [表达式] 功能:源程序的最后一个语句,标志整个程序结 束,即告诉汇编程序,汇编到此结束。 • 表达式→为可选项,必须是存储器地址,即 程序的启动地址,常为标号。 • 不带表达式的END结束的模块不能单独运行, 为子模快
4、子程序定义伪指令 格式:<子程序名〉PR○C[NEAR]或FAR RET 子程序名〉ENDP PR○C.ENDP必须配对使用。 子程序名有标号属性,一般段内调用为NEAR或省略, 段间调用为FAR。 R印T为子程序返回指令,返回调用主程序 段内:[SP]↑→→P,SP+2→SP 段间:[SP]↑→|P,[SP+2]↑→cS,SP+4→SP
4、子程序定义伪指令 格式:〈子程序名〉PROC [NEAR]或FAR : RET 〈子程序名〉ENDP • PROC……ENDP必须配对使用。 • 子程序名有标号属性,一般段内调用为NEAR或省略, 段间调用为FAR。 • RET为子程序返回指令,返回调用主程序: 段内:[SP] ↑ →IP,SP+2 →SP 段间:[SP] ↑ →IP,[SP+2] ↑ →cs,SP+4→SP
STACK SEGMENT STACK 定义堆栈段及堆栈长度 DW 32 DUP(?) STACK ENDS DATA SEGMENT 定义数据段 DATA ENDS 定义代码段 CODE SEGMENT 将汇编源程序视为DOS下的子程序 BEGIN PROC FAR asSUME CS: CODE, SS: STACK, DS: DATA PUSH DS SUB AX, AX 将程序段前缀PSP进栈 PUSH AX MOV AX, DATA 设置用户数据段 MOV DS, AX RET 返回到PSP,执行PSP中的第一条指令 BEGIN ENDP INT20H,结束程序返回调用程序 CODE ENDS END BEGIN
STACK SEGMENT STACK DW 32 DUP(?) STACK ENDS DATA SEGMENT : DATA ENDS CODE SEGMENT BEGIN PROC FAR ASSUME CS:CODE,SS:STACK,DS:DATA PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX : RET BEGIN ENDP CODE ENDS END BEGIN 定义堆栈段及堆栈长度 定义数据段 定义代码段 将汇编源程序视为DOS下的子程序 将程序段前缀PSP进栈 设置用户数据段 返回到PSP,执行PSP中的第一条指令 INT 20H,结束程序返回调用程序