四川警安职业学院标准教案纸
课程名称
计算机组成原理(第二十九讲)
任课教师
 
授课时间
地点
多媒体
授课班级
人数
教学目标
1. 掌握8086/8088宏汇编语句格式
2. 掌握数据定义及存储器分配伪指令
3. 掌握段定义伪操作
4. 熟练使用MASM进行汇编调试
教学重点
1. 8086/8088宏汇编语句格式
2. 数据定义
3. 段定义
4. 程序开始和结束伪操作
教学难点
1. 段定义伪操作
2. MASM应用
教学时数
2
教学方法
讲授法、演示法、实践操作法
教学手段
多媒体教学
教学内容:
4  8086/8088寻址方式及指令系统(三)
4.4 8086/8088伪指令
4.4.1 8086/8088宏汇编语句格式 
汇编语言源程序中的每个语句可以由四项组成,格式如下:
    [name] operation operand [;comment]
其中名字项是一个符号。
操作项是一个操作码的助记符,它可以是指令、伪操作或宏指令名。
操作数项由一个或多个表达式组成,他提供为执行所要求的操作而需要的信息。
注释项用来说明程序或语句的功能;为识别注释项的开始;也可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能.
1. 名字项
源程序中用下列字符表示名字:
字母:A~Z
数字:0~9
专用字符号:?、·、@-$
一般来讲,名字项可以是标号和变量。
标号:在代码段定义,后面跟冒号:,有三种属性:段、偏移及类型
(1) 段属性:定义标号的段起始地址,在CS寄存器中。
(2) 偏移属性:16位无符号数。
(3) 类型属性:用来指出该标号是在本段内引用还是在其它段内引用的。如在段内引用的,则称为NEAR,指针长度为2字节;如在段外引用,则称为FAR,指针长度为4字节。
变量:变量在除代码以外的其他段中定义,后面不跟冒号。它也可以用LABLEEQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。
(1) 段属性:定义变量的段起始地址,此值必须在一个段寄存器中。
(2) 偏移属性:变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用$来表示。
(3) 类型属性:变量的类型属性定义该变量所保留的字节数。如BYTE(1个字节长)WORD(2个字节长)DWORD(4个字节长)DQ(8个字节长)DT(10个字节长),这一点在数据定义伪操作中已作了说明。
在程序中同样的标号或变量的定义只允许出项一次,否则汇编程序会指示出错。
2. 操作项
操作项可以是指令、伪操作或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪操作,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。在后面的章节中,我们将详细讲述。
3. 操作数项
操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个或二个或一个也没有。对于伪操作或宏指令则给出它们所要求的参数。
操作数项可以是常数、寄存器、标号、变量或由表达式组成。在这里,我们将专门对表达式加以说明。表达式是常数、寄存器、标号、变量与一些操作符相组成的序列,可以有数字表达式和地址表达式两种。下面,我们先介绍一些常用的操作符。
(1) 算术操作符
算术操作符有十、一、*/MOD。其中MOD是指除法运算后得到的余数,如19/7的商是2,而19 MOD 7则为5(余数)
算术操作符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时其结果才是有效的。例如两个地址相乘或相除是无意义的。在地址表达式中,可以使用十或一,但也必须注意其物理意义,例如把两个不同段的地址相加也是无意义的。经常使用的是地址±数字量,它是有意义的。例如SUM+1是指SUM字节单元的下一个字节单元的地址(注意:不是指SUM单元的内容加1),而SUM-1则是指SUM字节单元的前一个字节单元的地址。
(2) 数值回送(Value_retuning)操作符
它有TYPELENGTHSIZESEG五种。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。
1) TYPE
 格式为:TYPE Variablelabel
 如果是变量,则汇编程序将回送该变量的以字节数表示的类型;DB1DW2DD4DQ8DT10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR-1FAR-2
2) LENGTH
  格式为:LENGTH Variable
  对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数。而对于其他情况则回送1
3) SIZE
  格式为: SIZE Variable
  其汇编的值为LENGTH Variable * TYPE Variable
4) OFFSET
 格式为:OFFSET Variablelabel
 汇编程序将回送变量或标号的偏移地址值。
5) SEG
 格式为:SEG Variablelabel
 汇编程序将回送变量或标号的段地址值。
(3) 属性操作符
 它有PTR、段操作符、SHORTTHISHIGHLOW 6种。
1) PTR
格式为:type PTR expression
PTR用来建立一个符号地址,但它本身并不分配存储器,只是用来已分配的存储地址赋予另一种属性,使该地址具有另一种类型。格式中的类型字段表示所赋予的新的类型属性,而表达式字段则是被取代类型的符号地址。
2) 段操作符:用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数MOV AXES[BX+SI]。可见它是用段寄存器:地址表达式来表示的。
3) SHORT
用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的±127个字节范围之内。
4) THIS
格式为:THIS attribute type
它可以象PTR一样建立一个指定类型(BYTEWORDDWORD)的或指定距离(NEARFAR)地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。
5) HIGHLOW
称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。
4. 注释项
注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。但是,注释项可以使程序易于被读懂,在编制程序时,更应学会写好注释。
4.4.2 数据定义及存储器分配伪指令 
 
这一类伪操作的格式是:
      [variable] menmonic operand , …,operand [;comments]
其中变量(variable)字段可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程使其记以第一个字节的偏移地址。
注释(comments)字段用来说明该伪操作的功能,它也是可有可无的。
助记符(mnemonic)字段说明所用伪操作的助记符,也常用的有以下几种:
(1) DB伪操作用来定义字节,其后的每个操作都占有一个字节。
(2) DW伪操作用来定义字,其后的每个操作数占有一个种字(低位字节在第一个字节地址中,高位字节在第二个字节地址中)
(3) DD伪操作用来定义双字,其后的每个操作数占有两个字。
(4) DQ伪操作用来定义字,其后的每个操作数占有四个字。
(5) DT伪操作用定义十个字节,其后的每个操作数占有十个字节,形成压缩的BCD码。
操作数(operand)字段可为:1)数值表达式;2)ASCII字符串;3)地址表达式;4)?;5) 操作数字段还可以使用复制操作符(duplication operator)来复制某个(或某些)操作数。其格式为:
    repeat_count DUP (operand,……,operand)
其中repeat_count可以是一个表达试,它的值应该是一个正数,用来指定括号中的操作数的重复次数。DUP操作可以嵌套。
6) 可用上面表达式的序列,各表达式用“,”隔开,表达式的个数确定了存储单元的个数。
顺便说明一下,这里操作数字段中的变量或标号可以使用表达式如:
    Variable constant expression
    label constant expression
在这种情况下,汇编后,存储器中应该存入表达式的值。
这里,我们再进一步说明变量的类型属性(type attribute)问题。在数据定义伪操作前面的变量的值是该伪操作中的第一个数据项在当前段内的第一个字节的偏移地址。此外,它还有一个类型属性用来表示该语句中的每一个数据项的长度(以字节为单位表示),因此DB伪操作的类型属性为1DW2DD4DQ8DT则为10,变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令还是字节指令。
4.4.3 表达式赋值伪操作 
有时程序中多次出现同一个表达式,为方便起见可以用赋值伪操作给表达式赋予一个名字。其格式如下:
      Expression name EQU Expression
此后,程序中凡需要用到该表达式之处就可以用表达式名来代替了。上式中的表达式可以是任何有效的操作数格式,可以是任何可以求出常数值的表达式,也可以是任何有效的助记符。必须注意EQU语句的表达式中如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。
另外还有一个与EQU相类似的=伪操作也可以作为赋值伪操作使用。它们之间的区别是EQU伪操作中的表达式名是不允许重复定义的,而伪操作=则允许重复定义。
4.4.4 段定义伪操作
段定义伪操作的格式如下:
    segment name SEGMENT
       
    segment name ENDS
其中删节号部分,对于数据段、附加段和堆栈段来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令及伪操作。
此外,还必须明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为:
    ASSUME assignment, , assignment
其中assignment说明分配情况,其格式为:
  segment register segment name
其中段寄存器名必须是CSDSESSS中的一个,而段名则必须是由SEGMENT定义的段中的段名。而ASSUME NOTHING 则可取消前面由ASSUME所指定的段寄存器。
4.4.5 程序开始和结束伪操作 
在程序的开始可以用NAMETITLE为模块取名字,NAME的格式是:
    NANE module_name
汇编程序将已给出的module_name作为模块的名字。如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为:
    TITLE text
TITLE伪操作可指定每一页上打印的标题。同时,如果程序中没有使用NAME伪操作,则汇编程序将用text中的前六个字符作为模块名。Text最多可有60个字符。如果程序中既无NAME又无TITLE伪操作,则将用源文件名作为模块名。所以NAMETITLE伪操作并不是必要的,但一般经常使用TITLE,以便在列表文件中能打印出标题来。
表示源程序结束的伪操作的格式为:
     END [label]
其中标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号。例4.4.8给出求两数之和的绝对值的程序实现,其中用TITLE给出标题,用END START表示程序结束。汇编程序将在遇END时结束汇编,而程序则将从START开始执行。
4.4.8: 源代码如下:
  TITLE  ABSOLT
DATA_SEG  SEGMENT
  OPER1  DW  12
  OPER2  DW  230
  RESULT  DW  ?
DATA_SEG ENDS
CODE_SEG SEGMENT
    ASSUME CS:CODE_SEGDS:DATA_SEG
STARTMOV AXDATA_SEG
      MOV DSAX
       MOV AXOPER1
       ADD AXOPER2
       JGE STORE
       NEG AX
STOREMOV RESULTAX
       MOV AX,4C00H
      INT 21H
CODE_SEG ENDS
4.5 上机操作过程  
4.5.1 汇编语言的工作环境
为运行汇编语言程序至少要在磁盘上建立以下文件:
MASM.EXE,  LIKE.EXE,  EXE2BIN.EXE,  DEBUG.COM,  EDIT.EXE
其中,MASM为汇编程序, LINK为连接程序,EXE2BIN为转换成COM文件所需要的程序,EDIT编辑程序。
4.5.2 建立ASM文件
为了说明汇编语言程序上机运行的过程,今举例如下:
4.5.1:请把40个字母a的字符串从源缓冲区传送到目的缓冲区。我们可以用字处理程序EDIT在磁盘上建立源程序,调用EDIT
C:\>EDIT
输入源文件,假设以文件名ex_movs.asm存盘。
4.5.3 MASM程序产生OBJ文件
源文件建立后,就要用汇编程序对源文件汇编,汇编后产生二进制的目标文件(OBJ文件),其操作与汇编程序回答如下:
C:\>masm ex_movs
    The IBM Personal Computer Assembler
    Version 1.00 (C) Copyright IBM Corp 1981
    Object filename [EX_MOVS.OBJ]:
    Source listing [NUL_LST]:ex_movs
    Cross reference [NUL.CRP]:ex_movs
          Warning    Severs
          Errors    Errors
            0        0
汇编程序的输入文件是ASM源文件,其输入文件可以有三个,表示于回答的中 间三行。第一个OBJ文件,这是我们汇编的主要目的,所以这个文件我们是需要的,对于[EX_MOVS.OBJ]后的:应回答↙(回车键,下同),这样就在磁盘上建立了这一目标文件。第二个是LST文件,称为列表文件。这个文件同时列出源程序和机器语言程序清单,并给出符号表,回答↙;如果需要这个文件,则可回答件名,这里是ex_movs↙,这样EX_MOVS.LST就建立起来了。LST清单的最后部分为段名表和符号表,表中分别给出出段名,段的大小及有关属性,以及用户定义的符号名,类型及属性。
汇编语言能提供的第三个文件是CRF文件,这个文件用来产生交叉引用表REF,对于一般程序不需要建立此文件,所以对于第三行的[NUL.CRF]:可以用↙来回答,这样就完成了汇编过程。
到此为止,汇编过程已经完成了。但是,汇编程序还有另一个重要功能:可以给出源程序中的错误信息。警告错误(Wraning Errors)指出汇编程序所认为的一般性错误,严重错误variable怎么记(Severe Errors)则指出汇编程序认为已使汇编程序无法进行正确汇编的错误。除给出错误的个数外,汇编程序还能指出错误信息,如5号错是符号重复定义错,9号则是符号没有定义错等。MASM程序可直接显示出错误性质。如果你的程序有错,则应重新调用编辑程序修改错误,并重新汇编直到汇编正确通过为止。当然汇编程序只能指出你的程序中的语法错误,至于程序的算法或编制程序中的其他错误则应在程序调试时去解决。
4.5.4 LINK程序产生EXE文件
汇编程序已产生出二进制的目标文件(OBJ),但OBJ文件并不是可执行的文件,还必须使用连接程序(LINK)OBJ文件转换为可执行的EXE文件,其他原因我们将在第十三章说明。当然,如果一个程序是有多个模块组成时,也应该通过LINK把他们连接在一起,操作方法及机器回答如下:
C:\>link ex_movs
IBM 5550 Multistation Linker 2.00
(C) Copyright IBM Corp.1983
Run File[NUL.MAP]:ex_movs
Libraries[.LIB]:
Warning:NO STACK segment
There was 1 error detected.
LINK程序有两个输出文件OBJLIBOBJ是我们需要连接的目标文件,LIB则是程序中需要用到的库文件,如无特殊需要,则应对[LIB]:回答。LINK程序有两个输出文件:一个是EXE文件,这当然是我们需要的,应对[EX_MOVS.EXE]:回答,这样就在磁盘上建立了该可执行文件。LINK的另一个输出文件为MAP文件,它是连接程序的列表文件,又称为连接映象(Linkmap),它给出每个段在存储器中的分配情况。
连接程序给出的无堆栈段的警告性错误并不影响程序的执行,所以,到此为止,连接过程已经结束,可以执行EX_MOVS程序了。
4.5.5 程序的执行
在建立了EXE文件后,就可以直接从DOS执行程序,如下所示:
 C:\>ex_movs
程序运行结束并返回DOS,但是用户程序已直接把结果在终端上显示出来,那么程序已经运行结束,结果也已经得到了。但是,我们的EX_MOVS程序并未显示结果,那么,你怎么知道程序执行的结果是否正确呢?此外,大部分程序必须经过调试阶段才能纠正程序执行中的错误,得到正确的结果,那么又怎样来调试程序呢?这里要使用DEBUG程序。有关DEBUG程序的各种命令请读者阅读手册,本书附录六介绍了DEBUG的主要命令。这里我们介绍几个最常用的命令。先进入DEBUG并装入我们要调试的程序EX_MOVS.EXE,键入如下:
C:\>debug
-
debug以短划线_来回答,在短划线_后面需输入DEBUG命令。DEBUG命令请查阅附录B有关DEBUG程序的说明。初学汇编语言程序设计的读者必须学会DEBUG的使用。虽然一开始要花费一些时间去学习有关命令,但它在调试程序时对你的帮助将是很大的,特别是一些教大的程序没有DEBUG的帮助,调试将会是十分困难的。
 
P139 4.15 4.16 4.17
教学反馈

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。