题目
习题与解答我们在学习8086汇编语言[1]程序格式[2]时要注意以下几点:1):掌握汇编语言程序的编程格式和语句的四个组成部分。特别是构成操作数[3]部分的两种操作符:分析操作符和合成操作符的作用和使用方法。2):常用的符号定义伪指令[4]、数据定义伪指令、段定义伪指令和过程定义伪指令的功能、格式和使用方法。3):宏指令[5]语句的定义,调用方[6]法以及对应的宏扩展。下面我们分别学习这几点:一:汇编语言程序的格式汇编语言的源程序[7]是由各条语句构成的。每条语句可以由四项构成,格式如下:[name] operation operand [;comment]其中名字项是一个符号。操作项是一个操作码[8]的助记符,它可以是指令、伪操作或宏指令名。操作数项是由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。注释项用来说明程序或语句的功能。;为识别注释项的开始。上面四项中带方括号的两项可有可无。各项之间必须用“空格”(SPACE)或“横表”(TAB)符隔开。名字项(标号[9])关于名字或标号项我们要注意以下几点:1):标号在代码段中定义,后面跟冒号。在除代码段以外的其他段中定义时后面不跟冒号。2):标号和一条指令的地址相联系,可作为JMP和CALL指令的操作地址。一般伪指令中的名字一般不作转移指令的操作数,但在间接寻址[10]时可以作转移指令的操作数。名字可用来表示变量名、段名、过程名、符号名等。3):标号或名字可任选或省略。4):标号和变量均有三种属性:段值属性(SEGMENT)、段内的地址偏移量属性(OFFSET)和类型属性(TYPE).操作项它可以是指令、伪操作或宏指令名。1):指令就是前面我们所学近100条8086指令2):伪指令或宏指令我们在后面再作详细的介绍。操作数也就是程序要加工处理的对象。它可分为三类:常数、操作数和表达式。1):常数:IBM-PC汇编语言允许有二进制[11]、八进制[12]、十进制[13]、十六进制[14]常数,分别用后缀B、O、D、H表示,还允许使用字符串常数,须用单引号括起来。2):操作数:可以是常数操作数、寄存器[15]操作数和存储器[16]操作数。3):表达式:在汇编语言中,表达式可以是常数、寄存器、标号、变量以及运算符组成的算式。4):注释项:注释部分在语句后由“;”号作间隔,用来对语句的功能后某一程序段[17]加以说明,使程序易读下面我们学习一些汇编语言常用的运算符:算术运算符算术运算符有+、-、*、/和MOD。其中MOD是取余。算术运算符可用于数字表达式或地址表达式中。注意:当用于地址表达式中时,只有当其结果有明确的物理意义时其结果才有效。逻辑运算符逻辑运算符有AND、OR、XOR和NOT。逻辑操作[18]是按位操作的,它只能用于数字表达式中。关系运算符关系运算符有EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)六种.注意:关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址,计算结果应为逻辑值:结果为真时,表示为0FFFFH,结果为假时,则表示为0。例:MOV BX,((PORT_VAL LT 5)AND 20)OR((PORT_VAL GE 5)AND 30)当POTE_VAL<5时,汇编结果应该是:MOV BX,20当POTE_VAL>5时,汇编结果应该是:MOV BX,30数值回送操作符它有TYPE、LENGTH、SIZE、OFFSET、ORG5种。这些操作符把一些特征或存储器地址的部分作为数值回送。下面我们分别学习以下它们。TYPE格式为:TYPE Variable或label如果是变量,则汇编语言将回送该变量以字节数表示的类型:DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,则汇编程序[19]将回送代表该标号类型的数值:NEAR为-1,FAR为-2。LENGTH格式为:LENGTH Variable对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,对于其他情况回送1。例: ABC DW 100 DUP(0)对于指令: MOV CX,LENGTH ABC汇编程序将使其形成为:MOV CX,100SIZE格式为:SIZE Variable汇编程序应回送分配给该变量的字节数。注意:此值是LENGTH值和TYPE 值的乘积。OFFSET格式为:OFFSET Variable或label汇编程序将回送变量或标号的偏移地址值。SEG格式为:SEG Variable或label汇编程序将回送变量或标号的段地址。二:常用的伪指令8086/8088宏汇编程序提供了许多伪指令来辅助用户编程。伪指令是说明性的指令,“伪”体现在汇编时不产生机器指令[20]。下面我们学习一些常用的伪指令的格式和功能。符号定义伪指令1)等值伪指令-----EQU格式为:<符号名> EQU <表达式>功能是:给符号定义一个值,或定义为别的符号名,甚至是一条可执行的命令或表达式的值等。例: CONST EQU 298LAB EQU 10*3PH EUQ PUSH注意:EQU伪指令不能重新定义,即在同一源程序中,用EQU伪指令定义的符号,不能在重新赋予不同的值。2)等号伪指令------=格式为:<符号名>=<表达式>功能:同EQU伪指令,但不同之处是可以对符号名进行重新定义。例:SET=5...SET=SET+1注意:SET=5和SET EQU 5不允许在同一程序中同时定义使用。数据定义伪指令格式为:<变量名>DB<表达式><变量名>DW<表达式><变量名>DD<表达式><变量名>DQ<表达式><变量名>DT<表达式>功能为:数据定义伪指令可以把其后定义的数据存入指定的存储单元[21],或者只分配存储器空间而并不存入确定的数据。DB、DW、DD、DQ、DT伪指令分别用来定义字节、字、双字、四字和五字,被说明的每个操作符分别占有一个字节、两个字节、四个字节、八个字节和十个字节。关于此伪指令我们还要注意以下几点:1):所定义的操作数可以是常数或表达式;2):所定义的操作数可以是字符串;3):所定义的操作数可以是?,表示保留存储空间,但不存入数据;4):所定义的操作数可以用复制操作符来复制的某些操作数.例:DATA DB 10,20STR DB ‘ABC’DEF DW ?,288ARRAR DB 30 DUP(?)ARRA DW 20 DUP(0)段定义伪指令存储器的物理地址是由段地址和偏移地址结合而成的。段定义伪指令使我们按段来组织程序和分配存储器。段定义的伪指令有SEGMENT、ENDS、ASSUME、ORG、PAGE、PUBLIC等。1):SEGMENT和ENDS功能为:把汇编语言源程序分成个逻辑段,并指出逻辑段的起始和终止地址。格式为:<段名> SEGMENT [定位类型] [组合类型] ['类别']...<段名> ENDS其中:1)段名可由用户自己命名.2)定位类型、组合类型和类别是赋给段名的属性3)"[]"号中的项可以省略."定位类型"的省缺值为PARA,表示该段必须从小段边界开始,即段地址的最低两个十六进制位必须为0。"组合类型"的省缺值为NONE,表示本段与其他逻辑上下不发生关系,每段都有自己的基地址。2):ASSUME功能:为汇编程序提供了程序的段结构,并指明相应的逻辑段应通过对应的寄存器寻址[22]。格式:ASSUME <段寄存器名>:<逻辑段名>[,…]过程定义伪指令功能:过程定义伪指令又称子程序[23]定义伪指令,用以在程序中定义一个子程序,以便提供主程序的调用。格式:<过程名> PROC [NEAR]/FAR...RET<过程名> ENDS程序结束伪指令功能:用来标志整个源程序的结束格式:END <起始符号地址[24]>三:宏指令的定义和调用宏指令语句是一种源程序级嵌式的程序语句。将程序中多次重复使用的源程序段,预先定义成所使用的宏指令语句,通常成为宏定义。在程序中可以用已定义的宏指令来代替着个程序段执行,称为宏调用。宏定义中可以定义使用参数,并且宏定义可嵌套。调用时,汇编程序先对宏指令语句进行宏扩展,即将宏定义中的程序段嵌入到宏指令语句处。宏指令定义的好处:可以简化设计并且优化结构。宏指令定义的形式格式:<宏指令名> MACRO [Par1,Par2,…]语句1;语句2;……语句n;ENDM说明:1)宏指令名是宏定义的名字,作为宏指令语句的操作符,其功能就是MACRO与ENDM之间语句的功能.2)Par1,Par2是定义的形式参数[25],指令的操作码和操作数均为形式参数,在进行宏调用时,宏指令语句中的实在参数将对形式参数作一一对应的替换.形式参数并不是必须的。3)MACRO称为宏定义伪指令,ENDM称为宏定义结束伪指令,它们之间的语句即程序段称为宏体.宏指令的调用形式宏调用实际上就是调用执行已定义过的宏指令语句,其形式为:<宏指令名>[R1,R2,…]说明:1)宏指令名必须和宏定义中的宏指令名一致,最多可由1-8个字母数字组成.2)R1,R2,…为实在参数,调用时其类型和顺序必须和宏定义中的形蚕一一对应。例:定义一个缓冲区,它包含有33H,34H,35H,和36H,四个字符,把这4个数据依次复制20次,存入接着的存储区,最后显示出复制结果。
习题与解答我们在学习8086汇编语言[1]程序格式[2]时要注意以下几点:1):掌握汇编语言程序的编程格式和语句的四个组成部分。特别是构成操作数[3]部分的两种操作符:分析操作符和合成操作符的作用和使用方法。2):常用的符号定义伪指令[4]、数据定义伪指令、段定义伪指令和过程定义伪指令的功能、格式和使用方法。3):宏指令[5]语句的定义,调用方[6]法以及对应的宏扩展。下面我们分别学习这几点:一:汇编语言程序的格式汇编语言的源程序[7]是由各条语句构成的。每条语句可以由四项构成,格式如下:[name] operation operand [;comment]其中名字项是一个符号。操作项是一个操作码[8]的助记符,它可以是指令、伪操作或宏指令名。操作数项是由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。注释项用来说明程序或语句的功能。;为识别注释项的开始。上面四项中带方括号的两项可有可无。各项之间必须用“空格”(SPACE)或“横表”(TAB)符隔开。名字项(标号[9])关于名字或标号项我们要注意以下几点:1):标号在代码段中定义,后面跟冒号。在除代码段以外的其他段中定义时后面不跟冒号。2):标号和一条指令的地址相联系,可作为JMP和CALL指令的操作地址。一般伪指令中的名字一般不作转移指令的操作数,但在间接寻址[10]时可以作转移指令的操作数。名字可用来表示变量名、段名、过程名、符号名等。3):标号或名字可任选或省略。4):标号和变量均有三种属性:段值属性(SEGMENT)、段内的地址偏移量属性(OFFSET)和类型属性(TYPE).操作项它可以是指令、伪操作或宏指令名。1):指令就是前面我们所学近100条8086指令2):伪指令或宏指令我们在后面再作详细的介绍。操作数也就是程序要加工处理的对象。它可分为三类:常数、操作数和表达式。1):常数:IBM-PC汇编语言允许有二进制[11]、八进制[12]、十进制[13]、十六进制[14]常数,分别用后缀B、O、D、H表示,还允许使用字符串常数,须用单引号括起来。2):操作数:可以是常数操作数、寄存器[15]操作数和存储器[16]操作数。3):表达式:在汇编语言中,表达式可以是常数、寄存器、标号、变量以及运算符组成的算式。4):注释项:注释部分在语句后由“;”号作间隔,用来对语句的功能后某一程序段[17]加以说明,使程序易读下面我们学习一些汇编语言常用的运算符:算术运算符算术运算符有+、-、*、/和MOD。其中MOD是取余。算术运算符可用于数字表达式或地址表达式中。注意:当用于地址表达式中时,只有当其结果有明确的物理意义时其结果才有效。逻辑运算符逻辑运算符有AND、OR、XOR和NOT。逻辑操作[18]是按位操作的,它只能用于数字表达式中。关系运算符关系运算符有EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)六种.注意:关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址,计算结果应为逻辑值:结果为真时,表示为0FFFFH,结果为假时,则表示为0。例:MOV BX,((PORT_VAL LT 5)AND 20)OR((PORT_VAL GE 5)AND 30)当POTE_VAL<5时,汇编结果应该是:MOV BX,20当POTE_VAL>5时,汇编结果应该是:MOV BX,30数值回送操作符它有TYPE、LENGTH、SIZE、OFFSET、ORG5种。这些操作符把一些特征或存储器地址的部分作为数值回送。下面我们分别学习以下它们。TYPE格式为:TYPE Variable或label如果是变量,则汇编语言将回送该变量以字节数表示的类型:DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,则汇编程序[19]将回送代表该标号类型的数值:NEAR为-1,FAR为-2。LENGTH格式为:LENGTH Variable对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,对于其他情况回送1。例: ABC DW 100 DUP(0)对于指令: MOV CX,LENGTH ABC汇编程序将使其形成为:MOV CX,100SIZE格式为:SIZE Variable汇编程序应回送分配给该变量的字节数。注意:此值是LENGTH值和TYPE 值的乘积。OFFSET格式为:OFFSET Variable或label汇编程序将回送变量或标号的偏移地址值。SEG格式为:SEG Variable或label汇编程序将回送变量或标号的段地址。二:常用的伪指令8086/8088宏汇编程序提供了许多伪指令来辅助用户编程。伪指令是说明性的指令,“伪”体现在汇编时不产生机器指令[20]。下面我们学习一些常用的伪指令的格式和功能。符号定义伪指令1)等值伪指令-----EQU格式为:<符号名> EQU <表达式>功能是:给符号定义一个值,或定义为别的符号名,甚至是一条可执行的命令或表达式的值等。例: CONST EQU 298LAB EQU 10*3PH EUQ PUSH注意:EQU伪指令不能重新定义,即在同一源程序中,用EQU伪指令定义的符号,不能在重新赋予不同的值。2)等号伪指令------=格式为:<符号名>=<表达式>功能:同EQU伪指令,但不同之处是可以对符号名进行重新定义。例:SET=5...SET=SET+1注意:SET=5和SET EQU 5不允许在同一程序中同时定义使用。数据定义伪指令格式为:<变量名>DB<表达式><变量名>DW<表达式><变量名>DD<表达式><变量名>DQ<表达式><变量名>DT<表达式>功能为:数据定义伪指令可以把其后定义的数据存入指定的存储单元[21],或者只分配存储器空间而并不存入确定的数据。DB、DW、DD、DQ、DT伪指令分别用来定义字节、字、双字、四字和五字,被说明的每个操作符分别占有一个字节、两个字节、四个字节、八个字节和十个字节。关于此伪指令我们还要注意以下几点:1):所定义的操作数可以是常数或表达式;2):所定义的操作数可以是字符串;3):所定义的操作数可以是?,表示保留存储空间,但不存入数据;4):所定义的操作数可以用复制操作符来复制的某些操作数.例:DATA DB 10,20STR DB ‘ABC’DEF DW ?,288ARRAR DB 30 DUP(?)ARRA DW 20 DUP(0)段定义伪指令存储器的物理地址是由段地址和偏移地址结合而成的。段定义伪指令使我们按段来组织程序和分配存储器。段定义的伪指令有SEGMENT、ENDS、ASSUME、ORG、PAGE、PUBLIC等。1):SEGMENT和ENDS功能为:把汇编语言源程序分成个逻辑段,并指出逻辑段的起始和终止地址。格式为:<段名> SEGMENT [定位类型] [组合类型] ['类别']...<段名> ENDS其中:1)段名可由用户自己命名.2)定位类型、组合类型和类别是赋给段名的属性3)"[]"号中的项可以省略."定位类型"的省缺值为PARA,表示该段必须从小段边界开始,即段地址的最低两个十六进制位必须为0。"组合类型"的省缺值为NONE,表示本段与其他逻辑上下不发生关系,每段都有自己的基地址。2):ASSUME功能:为汇编程序提供了程序的段结构,并指明相应的逻辑段应通过对应的寄存器寻址[22]。格式:ASSUME <段寄存器名>:<逻辑段名>[,…]过程定义伪指令功能:过程定义伪指令又称子程序[23]定义伪指令,用以在程序中定义一个子程序,以便提供主程序的调用。格式:<过程名> PROC [NEAR]/FAR...RET<过程名> ENDS程序结束伪指令功能:用来标志整个源程序的结束格式:END <起始符号地址[24]>三:宏指令的定义和调用宏指令语句是一种源程序级嵌式的程序语句。将程序中多次重复使用的源程序段,预先定义成所使用的宏指令语句,通常成为宏定义。在程序中可以用已定义的宏指令来代替着个程序段执行,称为宏调用。宏定义中可以定义使用参数,并且宏定义可嵌套。调用时,汇编程序先对宏指令语句进行宏扩展,即将宏定义中的程序段嵌入到宏指令语句处。宏指令定义的好处:可以简化设计并且优化结构。宏指令定义的形式格式:<宏指令名> MACRO [Par1,Par2,…]语句1;语句2;……语句n;ENDM说明:1)宏指令名是宏定义的名字,作为宏指令语句的操作符,其功能就是MACRO与ENDM之间语句的功能.2)Par1,Par2是定义的形式参数[25],指令的操作码和操作数均为形式参数,在进行宏调用时,宏指令语句中的实在参数将对形式参数作一一对应的替换.形式参数并不是必须的。3)MACRO称为宏定义伪指令,ENDM称为宏定义结束伪指令,它们之间的语句即程序段称为宏体.宏指令的调用形式宏调用实际上就是调用执行已定义过的宏指令语句,其形式为:<宏指令名>[R1,R2,…]说明:1)宏指令名必须和宏定义中的宏指令名一致,最多可由1-8个字母数字组成.2)R1,R2,…为实在参数,调用时其类型和顺序必须和宏定义中的形蚕一一对应。例:定义一个缓冲区,它包含有33H,34H,35H,和36H,四个字符,把这4个数据依次复制20次,存入接着的存储区,最后显示出复制结果。
题目解答
答案
.model small
.stack
.data
source db 33h,34h,35h,36h
target db 80 dup(?)
.code
.startup
mov ax,ds
mov es,ax
cld
mov si,offset source
mov di,offset target
mov cx,80
rep movsb
mov si,0
mov bx,offset target
again:mov dl,[bx+si]
mov ah,2
int 21h
inc si
cmp si,80
jb again
.exti 0
end
第四章——汇编语言程序设计