1.内存模式和简化段定义伪指令
确定用户程序中代码和数据在内存中的存放方式。
格式: .MODEL <内存模式>,[函数调用方法]
6种模式:
模式 | 说明 | |
---|---|---|
Tiny | 微模式 | 一个既包含代码又包含数据的段。文件扩展名为 .com 的程序使用该模式 |
Small | 小模式 | 一个代码段和一个数据段。默认情况下,所有代码和数据都为近属性 |
Medium | 中模式 | 多个代码段,一个数据段 |
Compact | 紧凑模式 | 一个代码段,多个数据段 |
Large | 大模式 | 多个代码段和数据段 |
Huge | 巨模式 | 与大模式相同,但是各个数据项可以大于单个段 |
flat | 平坦模式 | 保护模式。代码与数据使用 32 位偏移量。所有的数据和代码(包括系统资源)都在一个 32 位段内,代码段和数据段使用同一个4GB段 |
函数调用方式:
区别 | C | sysCall | stdcall | BASIC | FORTRAN | PASCAL |
---|---|---|---|---|---|---|
入栈顺序 | 从右到左 | 从右到左 | 从右到左 | 从左到右 | 从左到右 | 从左到右 |
堆栈恢复者 | 调用者 | 子程序 | 子程序 | 子程序 | 子程序 | 子程序 |
是否可用vararg | 是 | 是 | 是 | 是 | 是 | 是 |
vararg表示实参数个数是可变的,如scanf,printf等函数。
C调用方式堆栈恢复由调用者(主程序)完成
常用Add ESP,4*n指令实现,其它调用方式由子程序完成
2、简化段定义伪指令
使用简化段定义伪指令之前必须使用内存模式伪指令MODEL。
格式如下:
.CODE [段名] ;代码段
.DATA ;数据段,已初始化数据
.DATA? ;数据段,未初始化数
.CONST ;常数段
.FARDATA [段名] ;远数据段,已初始化数据
.FARDATA? [段名] ;远数据段,未初始化数据
.STACK[长度] ;堆栈段
程序举例:
. MODEL SMALL
. STACK 20H ;定义堆栈段
. DATA ;定义数据段
┇
┇
.CODE ;定义代码段
BEGIN:……
┇
┇
MOV AH ,4CH
INT 21H
END BEGIN