第四章伪指令 联系客服

发布时间 : 星期日 文章第四章伪指令更新完毕开始阅读76be24d533d4b14e8524683b

解:如果当前数据段DS=0B47H,并且BLOCK1变量从偏移量为0000H的单元开始存储数据,则第一个$代表的是0B47 0008,第二个$代表的是0B47:000C。其存储示意图如图4-20所示。

图4-20 存储示意图

注意:符号“$”不允许出现在DB伪指令中,因为DB定义字节数据,无法满足16位偏移量的存储要求。

4.8 表达式和运算符

一条指令或伪指令语句进行操作的对象是操作数,根据语句的要求,操作数可以是常数、变量、标号、表达式或关键字。

表达式是操作数常见的形式,它可以由常数、变量、标号通过操作运算符连接而成。任一表达式的值是在汇编程序将源程序汇编成目标文件过程中计算确定的,而不是在程序运行过程中求得的。

8086/8088 CPU汇编语言中操作运算符分为:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性修改运算符。

4.8.1 算术运算符

表4-3列出了算术运算符。表中所列出的前两个运算符是属于单项运算符,仅表示数据的正负。+、-、﹡、∕运算是最常用的运算符,参加运算的数和运算的结果是整数。除法运算的结果只取商的整数部分,而MOD运算符是进行整数除法,运算结果只取它的余数部分。减法可用于两个操作数地址的运算(以变量名表示),其结果是一个常数,表示这两个变量之间的相距字节数。

表4-3 算术运算符

运算符 + - 语法 +表达式 -表达式 运算 正数(单项运算符) 负数(单项运算符) ﹡ ∕ MOD + - SHR SHL 表达式1﹡表达式2 表达式1∕表达式2 表达式1 MOD表达式2 表达式1+表达式2 表达式1-表达式2 表达式 SHR 次数 表达式 SHL 次数 乘法 除法 求余数 加法 减法 右移 左移 例4-20 请分析以下指令,掌握算术运算符的用法。 MOV AL, + 1 ;AL=01H MOV AL, -1 ;AL=0FFH MOV AL,5 *5 ;AL=19H

MOV AL,5/2 ;AL=02H,即5整除2,取整 MOV AL,7 MOD 2 ;AL=01H,即7整除2,取余 MOV AL, 3+4 ;AL=07H MOV AL,3-4 ;AL=0FFH 以上指令均为合法指令,但是要注意的是表达式的值不能超过目的操作数所允许的最大表示范围,如果超出了目的操作数的表示范围,汇编程序会出错。

算术运算符还有2个特殊的运算符SHR和SHL,这两个运算符和逻辑右移指令以及逻辑左移指令不是一一对应的,因为作为运算符SHR和SHL是在汇编时参与运算的,而指令SHR和SHL是在程序运行时被CPU执行的。

例4-21 分析以下指令,掌握SHR和SHL运算符的用法。 MOV AL,5*5 SHR 4 ;AL=00000001B MOV AL,34H SHR(1+ 2) ;AL=00011100B MOV AX,00FFH SHL 5 ;AX=1FE0H

SHR运算符是将表达式的值进行右移,每右移一次,表达式的值依次向右移动,而最高位补0。右移次数由SHR后面的次数决定。移动次数必须为正整数,或者是一个可以得到正整数的表达式,但是要注意优先级。

SHL运算符是将表达式的值进行左移,每左移一次,表达式的值依次向左移动,而最低位补0。左移次数由SHL后面的次数决定。移动次数与SHR的说明相同.

注意:在进行SHL算术运算时,如果表达式的最高位为1,则目的寄存器必须为16位通用寄存器,不允许为8位通用寄存器。

例如:MOV AL, 10000000B SHL 1

该指令在汇编过程中会出错,汇编程序认为“10000000B SHL 1”语句将无法得到有效的结果。而SHR运算符无此规定。

4.8.2 逻辑运算符

表4-4列出了逻辑运算符,参加运算的数和运算的结果均是整数。逻辑运算是按位进行的,与SHR和SHL运算符一样,逻辑运算符与逻辑运算指令是完全不同的。

表4-4 逻辑运算符 运算符 NOT AND 语法 NOT 表达式 表达式1 AND 表达式2 运算 逻辑非 逻辑与 OR XOR 表达式1 OR 表达式2 表达式1 XOR 表达式2 逻辑或 逻辑异或 例4-22请分析以下指令,掌握逻辑运算符的用法。 MOV AX, NOT 00FFH ;AX=0FF00H MOV AX,1234H AND 00FFH ;AX=0034H MOV AX,1234H OR 0FFFFH ;AX=0FFFFH MOV AX,00FFH XOR 0FFFFH ;AX=0FF00H 在使用逻辑运算符时,必须要注意类型相匹配。

4.8.3关系运算符

表4-5列出了关系运算符。这些运算符是用于比较两个表达式的。表达式必须是常数或同一个段内的变量。如果是常数,按无符号数比较;如果是变量,则比较它们的偏移量。比较结果以真(全‘1’)或假(全‘0’)的形式给出。

表4-5 关系运算符 运算符 EQ NE LT LE GT GE 语法 表达式1 EQ 表达式2 表达式1 NE表达式2 表达式1 LT 表达式2 表达式1 LE 表达式2 表达式1 GT 表达式2 表达式1 GE 表达式2 运算 两个表达式相等为真,否则为假 两个表达式不相等为真,否则为假 表达式1<表达式2为真,否则为假 表达式1≤表达式2为真,否则为假 表达式1>表达式2为真,否则为假 表达式1≥表达式2为真,否则为假 例4-23 请分析以下指令,掌握关系运算符的用法。 MOV AL,1 EQ 2 ;AL=00H MOV AX, 1 NE 2 ;AX=0FFFFH MOV AX , 8000H LT 20 ;AX=0000H MOV SI, 1 LE 0FFFFH ;SI=0FFFFH MOV AL, 5 GE 80H ;AL=00H MOV AL, 7 GE 8 ;AL=00H

在使用关系运算符时,两个表达式的值均作为无符号数进行比较。

4.8.4 数值返回运算符

这种运算符的对象必须是存储器操作数,即变量名或标号。通过运算后得到的是一个数值。其格式为:

<运算符> <变量名或标号>

说明:数值返回运算符共有5个。下面对它们的功能进行讲解。 1. SEG 运算符

当运算符SEG加在一个变量名或标号的前面时,得到的运算结果是该变量名或标号所在段的段首址。

例4-24 使用SEG取段首址赋予相应的段寄存器。 DSEG SEGMENT

VAR1 DW 1234H,5678H

DSEG ENDS

EXTRA SEGMENT

VAR2 DW 1000H,2000H CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG,ES:EXTRA START:

MOV AX, SEG VAR1 ;将VAR1变量所在的数据段段首址赋予AX MOV DS,AX ;DS←AX

MOV AX,SEG VAR2 ;将VAR2变量所在的附加段段首址赋予AX MOV ES,AX ;DS←AX MOV AH,4CH INT 21H CSEG ENDS END START

该程序的MOV BX, SEG VAR1指令相当于MOV AX,DSEG;MOV AX,SEG VAR2指令相当于MOV AX,EXTRA。

保存该程序,经汇编、连接后,输入DEBUG 111.EXE,再输入U命令观察机器码。如图4-21所示。

图4-21 U命令效果图

2. OFFSET 运算符

当运算符OFFSET加在一个变量或标号前面时,得到的运算结果是这个变量或标号在相应段内的偏移量。

3. TYPE运算符

运算符TYPE是将变量或标号的类型用数字形式进行表示。变量和标号的类型数字如表4-6所示。其中变量的类型数字正好分别是它们所占有的存储单元字节数。而标号的类型数字没有什么物理意义。

表4-6类型属性数字

类型 变量 类型属性 BYTE WORD DWORD NEAR FAR 类型数字 1 2 4 -1 -2 标号 TYPE后面可以跟存储器操作数、16位通用寄存器或段寄存器。 例如: