⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇006.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
 Flat 
 NEAR NEAR 16-bit Yes 
NEAR NEAR 16-bit No 
NEAR FAR 16-bit No 
FAR NEAR 16-bit No 
FAR FAR 16-bit No 
FAR FAR 16-bit No 
NEAR NEAR 32-bit Yes 
 

、SMALL

所有的数据变量必须在一个数据段之内,所有的代码也必须在一个代码段之内。在这种模型下,数据段寄存器的内容保持不变,所有转移也都是段内转移。

该存储类型是独立汇编语言源程序常用的存储模型。

、MEDIUM

所有的数据变量必须在一个数据段之内,但代码段可以有多个。在这种模型下,数据段寄存器的内容保持不变,转移可以是段间转移。

、COMPACT

数据段可以有多个,但代码段只能有一。

、LARGE

数据段和代码段都可以有多个,但一个数组的字节数不能超过64KB。

、HUGE

数据段和代码段都可以有多个,一个数组的字节数也可以超过64KB。

、FLAT

FLAT存储模式在创建执行文件时,将使该程序仅含一个包括程序数据和代码的32位段,并且只能在80386及其以后的计算机系统中运行。该程序的文件类型为EXE。

在使用该存储模式之前,必须先用伪指令.386、.486或其它伪指令来说明更高性能的CPU类型。也就是说:FLAT模式仅在386及其以后CPU模式下才能使用。

在该程序中,所有代码和数据位距的缺省值都是NEAR,子程序的类型也是NEAR,并且标识符@CodeSize,@DataSize和@Model的值分别为:0、0和7。

在FLAT存储模式下,程序将不使用段寄存器FS和GS。汇编程序在处理说明语句“.MODEL  FLAT”时,将自动生成下列段寄存器说明语句:

ASSUME  CS:FLAT, DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR

当然,程序员也可把该段寄存器说明语句写在其指令序列之中。

二、语言类型

其详细说明请见7.5.3节中所述。

三、操作系统类型

OS_DOS是当前唯一支持的选项值,也是该选项的缺省值。

四、堆栈类型

堆栈类型的值主要影响伪指令.STARTUP所生成的指令序列。该选项有二个可选值:NEARSTACK和FARSTACK。其中:NEARSTACK是该选项的缺省堆栈类型。

、NEARSTACK——堆栈段和数据段是同一段;

、FARSTACK——堆栈段和数据段是不同的段,且堆栈不在段组DGROUP中。

例如:

.MODEL  SMALL, C, OS_DOS, FARSTACK 
6.4.2 简化段定义伪指令
简化段定义伪指令在说明一个新段即将开始的同时,也说明了上一个段的结束。在本段定义结束时,也不必用伪指令“ENDS”来标识。

具体的伪指令说明形式及其功能描述如下:

1、代码段定义

.CODE

作用:说明其下面的内容是代码段中内容。

2、堆栈段定义

.STACK  [堆栈字节数]

其中,“堆栈字节数”可以不写,其缺省值为1024B。

3、数据段定义

.DATA / .DATA? / .CONST

作用:说明其下面的内容是数据段中的变量定义。

在一个源程序中,可以有多个伪指令.DATA定义的数据段,这就好象在源程序中定义多个同段名的数据段一样。

伪指令.DATA?说明下面是一个未初始化数据段的开始,伪指令.CONST说明下面是一个常数数据段的开始。这二条伪指令很少使用,除非在与高级语言编写的程序相结合时,为了遵守高级语言的某些约定,而需要特殊说明时才使用。

汇编程序在处理简化的堆栈段和数据段定义时,它会自动地把伪指令.STACK、.DATA、.DATA?和.CONST所定义的段组合成一个段组。如果想定义一个独立的、不与其它段组合在一起的数据段的话,那么,就可选用下面的数据段定义方式。

4、远程数据段定义

.FARDATA  [段名] / .FARDATA?  [段名]

其中:“段名”是可选项,如果不指定的话,则该段名就取其缺省段名。

作用:说明一个独立的数据段。

伪指令.FARDATA?说明下面是一个未初始化的、独立数据段的开始。通常情况下,很少使用该伪指令。
6.4.3 简化段段名的引用
当使用简化的段定义时,一般情况下,程序员可以不知道这些段的段名、段地址堆齐类型和组合类型等。但当把简化定义的段和标准定义的段混合使用时,就需要知道简化定义段的基本属性。表6.3是在小模式下段的基本属性对应表。

表6.3 小模式下简化段定义的缺省属性表

伪指令
 缺省段名
 对齐类型
 组合类型
 类别
 段组名
 
.CODE
 _TEXT
 WORD
 PUBLIC
 'CODE'
  
 
.FARDATA
 FAR_DATA
 PARA
 NONE
 'FAR_DATA'
 
 
.FARDATA?
 FAR_BSS
 PARA
 NONE
 'FAR_BSS'
  
 
.STACK
 STACK
 PARA
 STACK
 'STACK'
 DGROUP
 
.DATA
 DATA
 WORD
 PUBLIC
 'DATA'
 DGROUP
 
.DATA?
 BSS
 WORD
 PUBLIC
 'BSS'
 DGROUP
 
.CONST
 CONST
 WORD
 PUBLIC
 'CONST'
 DGROUP
 

在其它存储模型下,由伪指令".CODE"说明的代码段段名在"_TEXT"之前还要加上其模块名(源程序名)。假设,某模块名为ABC,则其缺省的代码段段名就为ABC_TEXT。因此,在这种情况下,程序的模块名或源程序名不要以数字开头。

例6.15 简化段定义的方法

 .MODEL  SMALL 
.STACK  128 
.DATA 
 MSG DB "Simplified Segment Directives.$" 
.CODE 
 MOV  AX, @DATA ;取数据段的段值 
MOV DS, AX ;把给段寄存器DS赋值 
MOV DX, offset MSG 
MOV AH, 9H 
INT 21h 
MOV AX, 4C00H 
INT 21h 
END 

另外,在汇编程序MASM中,还提供了二组简化的代码伪指令:.STARTUP和.EXIT。

、.STARTUP——在代码段的开始,用于自动初始化寄存器DS、SS和SP;
、.EXIT——用于结束程序的运行,它等价于下列二条语句:

MOV AH, 4CH
INT  21h

当使用汇编程序TASM时,以上二条伪指令分别改为:STARTUPCODE和EXITCODE。假设使用汇编程序MASM,那么,例6.15可改写成例6.16的形式。

例6.16

 .MODEL  SMALL 
.STACK  128 
.DATA 
 MSG DB "Simplified Segment Directives.$" 
.CODE 
 .STARTUP                               ;自动初始化寄存器DS、SS和SP 
MOV DX, offset MSG 
MOV AH, 9H 
INT 21h 
.EXIT 
END 
6.5 源程序的辅助说明伪指令
除了以上一些使用率较高的伪指令外,还有一些使用频率不太高的其它伪指令。下面仅列举几个这样的伪指令。

6.5.1 模块名定义伪指令NAME
模块名定义伪指令NAME说明该源程序的模块名。该伪指令的一般格式如下:

NAME  [模块名字符串]

6.5.2 页面定义伪指令PAGE
在源程序的开始,可用伪指令PAGE说明每页的最大行数、每行的字符数。该伪指令的一般格式为:

PAGE  [[行数], 宽度]

其中:“行数”的取值范围为[10, 255],“宽度”的取值范围为[60, 132]。

如:伪指令“PAGE 60, 80”说明每页最多有60行,每行最多有80个字符。

如果要在某指定行之后强行换页的话,那么,可在该行的下面书写不带操作数的伪指令PAGE。

6.5.3 标题定义伪指令TITLE
标题定义伪指令TITLE说明打印的标题,该标题可有60个字符。该伪指令在源程序头部只能书写一次,其一般格式如下:

TITLE  [标题字符串]

如果程序中没有使用NAME伪操作,则汇编程序将用“标题字符串”的前六个字符串作为其模块名。如果程序中既无NAME伪操作,也无TITLE伪指令,那么,源文件名将作为模块名。

在汇编程序TASM环境下,标题定义伪指令是%TITLE。

6.5.4 子标题定义伪指令SUBTTL/SUBTITLE
子标题定义伪指令SUBTTL/SUBITLE说明打印页上的子标题,该子标题也可有60个字符,它在每页的第三行打印。该伪指令的一般格式如下:

SUBTTL/SUBTITLE  [标题字符串]

 6.6 习题
6.1、简述ASSUME伪指令的作用,用该语句说明的段寄存器不用对其赋段地址的初值? 
 
6.2、用二种定义方法堆栈段,并给出相应的初始化语句或说明。 
 
6.3、把下列C语句的语句改写成功能相同的汇编语言程序片段(其中:变量都为整型变量)。 
 
1)、h = (key & 0XFF00) >> 8;
2)、k = (k + '1' – 0xabcd) / 56;
3)、for (i = s = 0; i < 100; i++) s += data[i] * 2;
4)、for (s = 0, i = 100; i > 0; i--) s += i * 2; 
 
6.4、把下列C语言的语句改写成等价的汇编语言程序段(不考虑运算过程中的溢出)。 
 
If (a<1 || b/4 > 10 && c%8==5) {
 a = 20+b++;
 c <<= 2;
 }
else {a = 21-(++c);
   b--;
  }
其中:变量a、b和c都是有符号的整型(int)变量。
 
6.5、假设内存单元中有三个字a、b和c,编写一个程序,它可判断它们能否构成一个三角形,若能,CF为1,否则,CF为0。 
 
6.6、假设有三个无符号字存放在以Buffer为开始的缓冲区中,编写一个程序把它们从低到高排序好。 
 
6.7、编写一个程序,它把一位十六进制数转化成相应的数字字符或大写字母。 
 
6.8、编写一个程序,它把一个合法的十六字符转化成相应的数值。 
 
6.9、编写一个程序,它可统计32数DX:AX中二进制位是1的位数。 
 
6.10、编写一个程序,它把CH和CL中的二进制位依次交叉存入AX中。 
 
6.11、编写一个程序,求出从内存单元1000:0000开始的1024个字的32位累加和,并把该值存入程序中的变量Data中。 
 
6.12、假设从变量Buff开始存放了200个字,编写一个程序统计出其正数、0和负数的个数,并把它们分别存入N1、N2和N3中。 
 
6.13、用双重循环把下三角乘法表存入从product开始的45个字节中。 
 
6.14、表示源程序结束的伪指令是什么?在其后所编写的指令在被汇编吗? 
 
6.15、汇编语言程序一定会从代码段的第一条指令开始执行吗?如果不是,如何指定程序的入口地址? 
 
6.16、编写一个程序,它把字符串String两端的空格删除(字符串以0结束)。 
 
6.17、编写一个程序,它把字符串String中的数字字符删除掉(字符串以0结束)。 
 
6.18、编写一个程序,它把AX的值以二进制字符串的形式存放在以buff开始的缓冲区中。 
 
6.19、假设有一个以Data为首地址的字缓冲区,其缓冲区的大小在第一个字中,试编写一个程序,求出该缓冲区数值的最大值和最小值,并分别存入DI和SI中。 
 
6.20、编写一个程序片段,把32位数DX:AX向左移六位。 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -