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

📄 汇004.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
 PTR、SEG、OFFSET、TYPE、THIS、:(用于段超越前缀) 
*、/、MOD、SHL、SHR 
HIGH、LOW 
+、- 
EQ、NE、LT、LE、GT、GE 
NOT 
AND 
OR、XOR 
优先级:低
 SHORT 

这些符号及其优先级并不要强记它们,有些符号同时出现的可能性非常小。在以后的学习中对常用的几个加以运用也就记住了。
4.7.3 地址表达式
地址表达式是计算存储单元地址的表达式,它可由标号、变量名和由括号括起来的基址或变址寄存器组成。其计算结果表示一个存储单元的地址,而不是该存储单元的值。

例如:
 
 B1 DB 10H, 11H, 12H 
 DB  'ABCD' 
W1 DW 1234H, 5678H 

表达式B1+1、B1+3和W1+2等都是地址表达式,其值所代表的地址位置如图4.10所示。显然这些地址表达式所对应的存储内容分别为:11H、'A'和5678H。

… 10 11 12 'A' 'B' 'C' 'D' 34 12 78 56 … 

    
B1 B1+3 W1+2 

图4.10 地址表达式所对应的存储单元位置示意图

注意:地址表达式W1+1并不表示字变量W1之后一个字的存储单元,而是字变量W1之后一个字节的存储单元,它的存储单元值是:7812H。
4.8 符号定义语句
在程序中,我们经常要使用一些常量或数值表达式,并把它们直接写在指令中,但当需要修改时,就要对它们逐个进行修改,这无疑会增加维护程序的工作量,而且每个常量或表达式所代表的含义也容易遗忘。

为了改善程序的可读性,尽量减少维护程序的工作量,汇编语言提供了为常量或表达式定义一个符号名的方法。一旦定义了符号名,在指令中就可直接使用它们。

4.8.1 等价语句
1、一般格式

等价语句的一般使用格式如下:

符号名 EQU 表达式

作用是左边的符号名代表右边的表达式。

注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义。

2、用符号名代表常量或表达式

当把一个常量或表达式定义成一个具有一定含义的符号名后,在程序中就可以用该符号名来代表该常量或表达式。

例如:
 
 NUMBER EQU 100 ;给缓冲区的长度取一个符号名 
BUFF_LEN EQU NUMBER+2 
CR EQU 13 ;给“回车”符的ASCII码定义一个符号名 
LF EQU 10 ;给“换行”符的ASCII码定义一个符号名 
BUFFER DB NUMBER, ?, NUMBER DUP (?) ;用符号名来定义缓冲区 

3、用符号名代表字符串

用一个具有一定含义的符号名定义某一个较长的字符串,在随后的程序中就用该符号名。例如:

GREETING EQU "How are you!"

在该定义之后,就可使用符号名GREETING来代表字符串"How are you!"。

4、用符号名关键字或指令助忆符

用一个(组)程序员自己习惯的符号名来代替汇编语言中的关键字或指令助忆符。但在此建议不要这样做,因为程序的编写者习惯,程序的其他阅读者可能会觉得很别扭。

例如:

MOVE    EQU MOV   ;给指令MOV取另一个符号名MOVE
COUNTER  EQU CX    ;给寄存器CX取一个叫“计数器”的符号名

上面的定义只是给原来的助忆符MOV和CX起了另一个别名,而原来助忆符MOV和CX仍然可以使用,所以,我们可编写如下语句:

MOVE AX, CX        ;相当于指令:MOV  AX, CX
MOV  COUNTER, BX    ;相当于指令:MOV  CX, BX

5、用符号名定义存储单元的别名

可对一片存储单元定义另一个数据类型的符号名,有关叙述参见前面的操作符THIS。

例如:
 
 WORD1 EQU THIS WORD ;给后面的字节存储单元取一个字属性的符号名 
BYTE1 DB 12h, 21h 
FLAG DW 1234H 
FLAG1 EQU byte ptr FLAG ;给FLAG的低字节取一个字节属性的符号名 
FLAG2 EQU byte ptr FLAG+1 ;给FLAG的高字节取一个字节属性的符号名 

有了上述定义后,可编写如下语句:

MOV AX, WORD1      ;执行后,(AX)=2112H
MOV BL, FLAG1      ;执行后,(BL)=34H
4.8.2 等号语句
汇编语言提供了用等号来定义符号常数的方法,即可用符号名代表一个常数。其一般格式如下:

符号名=数值表达式

数值表达式在汇编时应该可以计算出数值,它不能含有向前引用的符号名称。用等号语句定义的符号可以被重新定义。例如:

 ABC = 10 + 200 * 5 ;ABC的值为1010 
ABC1 = 5 * ABC + 21 ;ABC1的值为5071 
COUNT = 1 ;COUNT的值为1 
COUNT = 2*COUNT + 1 ;COUNT的值为3 

4.8.3 符号名定义语句 
符号名定义语句LABEL与前面的操作符THIS功能类似,该语句定义一个指定的符号名,该符号名的段地址和偏移量与下面紧跟存储单元的相应属性相同,但该符号的类型是新指定的。LABEL语句的一般格式如下:

符号名 LABEL 类型

其中:常用的类型有BYTE、WORD、DWORD、NEAR和FAR等。

例如:
 
NEXT: …
 
WBUFFER LABEL WORD ;WBUFFER与BUFFER具有相同的段地址和;偏移量,但它们的数据类型不同。 
BUFFER DB 200 DUP(0) 
NEXT1 LABEL FAR ;NEXT1和NEXT具有相同的段地址和偏移量,;NEXT1是“远”标号,NEXT是“近”标号。 
MOV AX, BX 

标号NEXT1和NEXT可用于不同的情况。当在同一个模块内转移时,可使用标号NEXT;当在不同的模块之间进行转移时,需要使用“远”标号NEXT1。
4.9 习题
4.1、判断下列标识符的合法性。
 
1)、code
3)、ABCDH
5)、eax
7)、A?@
9)、www@zsu.edu.cn
11)、_BX
 2)、Data
4)、1abcH
6)、???01
8)、www@zsu
10)、AX$DX
12)、CX 
4.2、按下面要求写出相应的数据定义语句(未指定变量名的,可任意指定或省缺)。
 
1)、定义一个字节区域,第一个字节的值为20,其后跟20个初值为0的连续字节;
2)、定义一个以0为结束符的字符串,其初值为:The course is easy;
3)、定义一个以'$'为结束符的字符串,该串中含有换行符和回车符;
4)、定义100个字,其初值为0;
5)、从一个偶地址开始定义一个字变量word;
 
6)、先定义一个字符串String,其偏移量指定为10,其初值为"ABCDEF",然后再定义3个字类型的数组Data,要求String和Data的偏移量相同;
 
7)、定义一个字符串String,其初值为"12345678",再定义4个字类型的数组Data,要求String和Data共享同一片内存单元;
 
4.3、把下列C语言的变量定义语句改写成与之等价的汇编语言语句。
 
1)、char  ch1, ch2[3], ch3[]="Are you ready?", ch4='Q';
2)、int  w1, w2[5], w3=0x1234, w4[]={90, 89, 432, 344};
3)、long int d1=1234, d2, d3[10], d4[]={1, 2, 3, 4, 5, 6};
 
4.4、假设4.3题中三组变量在内存中是连续存放的,且变量ch1的偏移量是20H,试求出其它每个变量的偏移量。
 
4.5、按下列要求分别写出汇编语言的结构定义,如果没有说明结构分量的类型,请根据日常习惯自行指定其数据类型(可使用已有的结构定义)。
 
1)、定义日期结构类型Date,其包括:Year(年)、Month(月)和Day(日);
 
2)、定义时间结构类型Time,其包括:Hour(小时)、Minute(分)、Second(秒)和centsec(百分之一秒);
 
3)、定义结构Peason,其包括:name(姓名,字符,长度为8)、Birth(出生日期,Date),stature(身高,以厘米为单位的整数),Address(地址,30个字符)
 
4.6、试求出4.5题各结构中字段的偏移量。
 
4.7、把下列C语言的结构或结构变量的定义改写为与之等价的汇编语言定义语句。
 
1)、struct  ScreenBuffer {
      char c1;   //字符
      char attr;  //字符属性
    } Buffer[2000];
 
2)、struct  FILE {
      int level, flags;
      char fd, hold;
      int bsize, istemp, token;
     };
 
3)、struct  CELLREC {
      char attrib;
      union {char text[201];
         long value;
         struct {long fvalue;
             char formula[201];
            } f;
         } v;
     };
 
4.8、按下列要求分别写出汇编语言的记录定义。
 
1)、定义标志位寄存器低8位标志位,其相应位用其标志位的符号来命名,未用部分的命名自行确定;
 
2)、定义一个压缩型的BCD码类型;
 
3)、把一个字节分成三部分:0~2位、3~5位和6~7位,每部分可独立存取,它们的初值分别为4,5和2;
 
4)、把一个字分割成:0~1位、2~6位、7~12位,其中第一部分的初值位3,第三部分的初值为25。
 
4.9、试求出4.8题各记录中字段的宽度和屏蔽属性值。
 
4.10、假设变量B1的偏移量为12H,试求出它们的属性OFFSET、TYPE、LENGTH和SIZE的值。
 
B1 DB    "The programming language is easy", 0
W1 DW    10 DUP(1, 2), 1234
D1 DD    20 DUP(0)
P1 PEASON <>, <>   ;结构PEASON的定义见4.4.2
U1 UNION1 3 DUP(<>)  ;联合UNION1的定义见4.4.3
 
4.11、试用三种方法定义字节变量(或字段名)B1和字变量(或字段名)W1,它们共享20个存储单元。
 
4.12、强制属性操作符会改变变量的定义属性吗?在C语言中存在类似功能的语句吗?若存在,请举例说明。
 
4.13、假设有题4.10题中的变量定义,试写出符合要求的地址表达式。
 
1)、取从B1开始的字母'p'和第一个'm';
 
2)、访问从W1开始的第3个字单元(从序数1开始计数,第1、第2、……)的值为2的存储单元;
 
3)、访问从D1开始的第10个双字单元;
 
4)、访问从P1开始的第2个结构中的字段NO;
 
5)、访问从U1开始的第3个联合中的字段WW;
 
4.14、把下列C语言程序中的说明性语句改写成等价的汇编语言语句。
 
#define N 200
struct buffer {
   char len1, len2, buff[N];
} buff;
int Data[N];
 
4.15、简述数值表达式与地址表达式的主要区别。
 
4.16、计算下列各数值表达式的值。
 
1)、12H AND 78H
3)、5467H XOR 12FFH
5)、10 LT 9
7)、1234H+89H SHL 1
 2)、1234 MOD 3 + 23H
4)、'A' OR 20H
6)、4567 / 13 + 10H
8)、8910H SHR 2 AND 506H 

⌨️ 快捷键说明

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