用汇编语言加法程序程序完成10以内加法运算程序的设计,保留源代码(配以合理准确的注释,调试结果正确),以及

周热销排行
用户评论(0)
在此可输入您对该资料的评论~
添加成功至
资料评价:汇编语言课件(1)—汇编语言程序设计基础知识_课件下载
汇编语言课件(1)—汇编语言程序设计基础知识
声明:本课件在电脑上可正常浏览,在手机或平板电脑上只能浏览到简介。汇编语言课件(1)—汇编语言程序设计基础知识的内容简介:
微机原理----汇编语言程序设计(1) 汇编语言程序设计基础知识(1) 本次课学习内容 汇编语言的基本知识和特点。 汇编语言的程序结构、段定义以及语句的格式。 汇编语言常用伪指令的使用方法。 本次课学习目标 能正确区分汇编语言和汇编程序的概念 能用图表示汇编程序的建立及汇编过程 了解MASM汇编语言程序设计的规范 &能正确使用数据定义及存储器分配伪指令(DB、DW、DD、DQ和DT)、段定义伪指令SEGMENT/ENDS、段寻址伪指令ASSUME,过程定义伪指令PROC/ENDP 汇编语言 汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。 用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快 。 汇编语言和高级语言的比较 汇编程序 汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。 汇编程序是完成汇编任务的程序。 基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)两种。 汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。 目标程序文件经连接定位后由计算机执行; 源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。 汇编语言程序的建立及汇编过程 一个简单的汇编程序 在数据段定义首地址为A的10个字符,将这10个字符以相反次序传送到附加段首地址为B的内存单元中。 LEA SI,A LEA DI,B ADD DI,9 MOV CX,10 MOVE:CLD LODSB STD STOSB LOOP MOVE MOV AH,4CH INT 21H START ENDP CSEG ENDS ;--------------------------------------------- END START 汇编语言的语句格式 汇编语言源程序中的每个语句可以由4项组成,格式如下 [名字项] 操作项 操作数项 ;注释项 AGAIN: MOV AL, [SI] ;取加数 A DB &ABCDEFG& 名字项 源程序中用下列字符表示名字: 字母:A~Z或a~z; 数字:0~9; 专用字符号:?、& 、@、―、$; 名字项可以是标号或变量。 标号 在代码段定义,后面跟冒号,表示处理器指令在主存中的逻辑地址分支、循环等程序的目的地址 标号有三种属性:段、偏移及类型。 ① 段属性:定义标号的段起始地址,在CS寄存器中。 ② 偏移属性:16位无符号数。 ③ 类型属性:用来指出该标号是在本段内引用还是在其他段内引用的。 例: AGAIN: MOV AL, [SI] 变量 变量在除代码以外的其他段中定义,后面不跟冒号。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。 ① 段属性定义变量的段起始地址,此值必须在一个段寄存器中。 ② 偏移属性变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用 $ 来表示。 ③ 类型属性变量的类型属性定义该变量所保留的字节数。 例: A DB &ABCDEFG& 操作项可以是指令、伪操作或宏指令的助记符。 操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。 注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。 分段结构 汇编语言源程序的程序基本结构是段,一个汇编语言源程序由若干个代码段、数据段、附加段和堆栈段组成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。任何可执行汇编语言程序至少要有一个代码段,通常还可能有数据段和堆栈段。每个段都有段首指令和段结束指令,段的内容介于这两条指令之间。 通常,一个汇编源程序一般应该由3个逻辑段组成,即数据段、堆栈段和代码段。每个逻辑段以SEGMENT语句开始,以ENDS语句结束。整个源程序以END语句结束。 数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。 堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。 代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。 段定义伪操作SEGMENT/ENDS 格式如下: segment-name SEGMENT & segment-name ENDS 其中删节号部分,对于DS、ES和SS来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令及伪操作。 ASSUME伪操作可用来明确段和段寄存器的关系 格式: ASSUME 〈段寄存器名〉:〈段名〉, 〈段寄存器名〉:〈段名〉, & 其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段中的段名。 指令 mov bl,xd mov xe,bl 被汇编为 mov bl,byte ptr[0000h] mov byte ptr es:[0000h],bl 其中,在变量xe前增加了段超越前缀ES:,这就是ASSUME的作用,也仅此而已。 设置段寄存器的初值 CS与IP CS与IP的初值不能在程序中显示设置,由系统自动设置为END后指定的起始地址。 DS和ES 设置方法如下: MOV AX,SEG NAME MOV DS,AX SS与SP 在程序中显示设置,类似于DS,例如: MOV AX,SSEG MOV SS,AX MOV SP,ST_TOP 若堆栈段定义时给出了参数STACK,则连接器LINK自动将SS:SP指向栈底; 若未定义堆栈段,则由系统指定堆栈,SS:SP也由系统自动设置。 程序开始和结束操作 开始:在程序的开始可以用NAME或TITLE为模块取名字 NAME module-name 汇编程序将给出的module-name作为模块的名字。 如果没有NAME伪操作,则也可以使用TITLE伪操作,其格式为: TITLE text TITLE伪操作可指定每一页上打印的标题。同时,如果程序中没有NAME伪操作,则汇编程序将用text中的前6个字符作为模块名。如果程序中既没有NAME伪操作也没有TITLE伪操作,则将用源文件名作为模块名。所以NAME及TITLE伪操作并不是必要的,但一般经常使用TITLE,以便在列表文件中能打印出标题来。 结束 END [label] 其中标号指示程序开始执行的地址。如果多个程序模块相连接,则只有主程序要使用标号,其它子程序模块则只用END而不必指定标号。汇编程序将在遇到END时结束汇编,而程序将从label处开始执行。 过程定义操作 过程名 PROC [NEAR]/FAR &过程中的语句序列& RET [&过程中的语句序列&] 过程名 ENDP 过程属性的定义原则: 调用程序和过程在同一个代码段内则使用NEAR属性 调用程序和过程不在同一代码段内则使用FAR属性 微机原理----汇编语言程序设计(2) 伪指令、表达式及运算符 主要内容 伪指令 数据定义伪指令DB、DW、DD、DQ、DT 符号定义伪指令EQU和= 对准伪操作EVEN和ORG 程序计数器$ 标号定义伪指令LABEL 汇编语言的表达式和运算符 算术运算符+、-、*、/、MOD、SHL、SHR 逻辑运算符AND、OR、XOR、NOT 关系运算符EQ、NE、LT、GT、LE、GE 分析运算符TYPE、LENGTH、SIZE、OFFSET、SEG 综合运算符PTR、段操作符、SHORT、THIS、 变量定义伪指令 变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值 [变量名] 变量定义符 操作数[,&,操作数] 变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。 在数据定义伪操作前面的值是该伪操作的第一个字节的偏移地址。此外,它还有一个类型属性用来表示该语句中的任一个数据项的长度。汇编程序可以用这种隐含的类型属性来确定某些指令是字节指令还是字指令。 变量定义符 主要包括下列几种: DB(Define Byte):定义字节,后面的每个操作数占1个字节。 DW(Define Word):定义字,后面的每个操作数占1个字。 DD(Define DWord):定义双字,后面的每个操作数占2个字。 DQ(Define QWord):定义四字,后面的每个操作数占4个字。 DT(Define Tbyte):定义十字节,后面的每个操作数占10个字节。 操作数 数值表达式; ASCⅡ码字符串; 地址表达式; ?(只保存内存空间,未定义初始值); DUP 子句,其格式为: 重复次数 DUP (操作数,&,操作数),DUP子句可以嵌套。 字节量数据(Byte-sized) DB定义8位、字节量变量数据 无符号整数0~255 补码表示的有符号整数:-128~+127 一个字符(ASCII码值) 压缩BCD码:0~99 非压缩BCD码:0~9 && 字变量数据 DW定义16位、字量变量数据 包含高低两个字节,16位无符号和有符号整数 16位段地址,16位偏移地址 占用2个连续的字节存储单元 双字量数据(Doubleword-sized) DD定义32位、双字量变量数据 &高对高、低对低&占用4个连续字节空间 操作数可以是常数,或者是表达式(根据该表达式可以求得一个常数)。 DATA1 DB 10,4,10H DATA2 DW 100,100H,-5 DATA3 DD 3*20, 0FFFFDH 其存储示意图如右所示: 操作数也可以是字符串 MESG DB &HELLO& DB &AB& DW &AB& 操作数?可以保留存储空间但不存入数据. ABC DB 0,?,?,?,0 DFF DW ?,52,? 经汇编后存储情况如图所示. 操作数字段还可以使用复制操作符(duplication operator)来复制某个(某些)操作数. ARRAY1 DB 2 DUP (0,1,2,?) ARRAY2 DB 100 DUP (?) DUP可以嵌套 ARRAY3 DB 100 DUP (0,2 DUP(1,2),0,3) 可以用DW 或DD把变量或标号的偏移地址(DW)或整个地址(DD)存入存储器。用DD伪操作存入地址时,第一个字为偏移地址,第二个字为段地址。 PTAB DW PAR1,PAR2,PAR3 ITAB DD DATA1, DATA2 符号定义伪指令 基本格式 符号名 EQU 表达式 符号名 = 常数表达式 功能:给表达式指定一个等价的符号名。 关于符号定义伪指令的说明 说明: =后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。 EQU后的表达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。 表达式中如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。 EQU不能重复定义,而&=&伪指令可以重复定义,其作用域从定义点到重新定义之前。 实例: 对准伪操作 EVEN EVEN伪操作使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以对于字数组为保证其从偶地址开始,可以在它前面用EVEN伪操作来达到此目的。例如: DATA_SEG SEGMENT A DB 1,2,3 EVEN WORD_ARRAY DW 100 DUP(?) ┇ DATA_SEG ENDS ORG 〈表达式〉 如常数表达式的值为n,则ORG伪操作可以使下一个字节的地址成为常数表达式的值n。其中表达式必须是一个可计算得到正整数的,数值范围在0~65535的表达式。 程序计数器$ 字符&$&在8086宏汇编中具有一种特殊的意义,把它称为程序计数器。表示位置计数器的当前值,它可以在数值表达式中使用。 在程序中,&$&出现在表达式里,它的值为程序下一个所能分配的存储单元的偏移地址。 例: ARRAY DW 1,2,$+4, 3,4,$+4 如汇编时,ARRAY分配的偏移地址是0074,则汇编后的存储区如右图所示。 标号定义伪指令LABEL 变量名或标号名 LABEL 类型 说明: 变量的类型可用 BYTE,WORD,DWORD 标号的类型可用NEAR和FAR 功能:在某一变量或标号的基础上定义一个新的类型不同的变量或标号 汇编语言的表达式和运算符 表达式 表达式是常数、寄存器、标号、变量与一些运算符相组合的序列,可以有数字表达式和地址表达式两种。 算术运算符 主要包括加(+)、减(-)、乘(*)、除(/)和求余(MOD)、左移(SHL)、右移(SHR)。其中MOD是指除法运算后得到的余数。 算术运算符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时其结果才是有效的。例如两个地址相乘或相除是无意义的。 在地址表达式中,可以使用+或者-,但也必须注意其物理意义。例如把两个不同段的地址相加也是无意义的。经常使用的是地址+数字量,它是有意义的。例如SUM+1是指SUM 字节单元的下一个字节单元的地址。 逻辑运算符 主要包括与(AND)、或(OR)、异或(XOR)、非(NOT) 逻辑运算符是按位操作的,它只能用于数字表达式中。 关系运算符 主要包括EQ(相等时为真)、NE(不相等时为真)、LT(小于时为真)、GT(大于时为真)、LE(小于或等于时为真)、GE(大于或等于时为真)等6种。 关系运算符的两个操作数必须都不能是数字或是同一段内的两个存储器地址。 其计算的结果为逻辑值,为真,则为全1,为假,则为全0 分析运算符 也称数据送回(Value returning)运算符,包括TYPE、LENGTH、SIZE、OFFSET、SEG五种,这些运算符把一些特征或存储器地址的一部分作为数值回送。 TYPE 格式:TYPE Variable或label 如果是变量,则汇编程序将回送该变量的以字节数表示的类型,DB为1,DW为2,DD为4,DQ为8,DT为10。 如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为-2。 LENGTH 格式为:LENGTH 变量 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元个数。而对于其他情况则回送1。 SIZE 格式为:SIZE 变量 其汇编的值为LENGTH 变量 * TYPE 变量,即回送直接分配给该变量的总的字节数。 OFFSET 格式为:OFFSET 变量或标号 汇编程序将回送变量或标号的偏移地址值。 SEG 格式为:SEG 变量或标号 汇编程序将回送变量或标号的段地址值。 汇编语言的运算符&&综合运算符 也称属性运算符,主要包括PTR、段操作符、SHORT、THIS、HIGH和LOW 6种。 段操作符: 用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数MOV AX,ES:[BX+SI]。可见它是用段寄存器地址表达式来表示的。 PTR 格式为:类型 PTR 地址表达式 PTR用来建立一个符号地址,但它本身并不分配存储器,只是用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型。 格式中的类型字段表示所赋予的新的类型属性,而表达式字段则是被取代类型的符号地址。 如果是变量,类型可取BYTE,WORD,DWORD。 如果是标号,类型可取NEAR和FAR。 SHORT 用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址&127个字节范围之内。 THIS 格式为:THIS 类型 与PTR类似,由它所生成的新的存储器操作数的段和偏移量部分与目前所能分配的下一个存储单元的段和偏移量相同。但类型由THIS指定 如果是变量,类型可取BYTE,WORD,DWORD。 如果是标号,类型可取NEAR和FAR。 微机原理&汇编语言程序设计(3) 80X86指令格式及寻址方式 80X86指令系统 指令的基本格式 寻址方式 指令执行时间 指令系统 中断及PC DOS系统功能调用 80286扩充的指令 80386扩充的指令 80486扩充的指令 Pentium CPU扩充的指令 学习指导 学习每一条指令时,应从以下几个方面着手: 指令的格式 指令的功能:该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 指令的寻址方式:该指令中的操作数可以采用何种寻址方式 该指令对状态标志位的影响 学习指令时,可多看实例,并自己编写源程序。 指令的基本格式 格式:操作码 操作数或操作数地址 格式说明: 操作码:指示计算机要执行的操作,对每一种操作指定确定的二进制代码。 操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数(src),一个目的操作数(dst)。 寻址方式 指令中操作数字段实质上是指出操作数存放于何处。一般来说,操作数可以跟随在指令操作码之后,称为立即数;操作数也可以存放在CPU内部的寄存器中,称为寄存器操作数。绝大多数的操作数存放在内存储器中,称为存储器操作数。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。这种寻找操作数的过程称为寻址,而寻找操作数的方法称为寻址方式。 寻址方式 固定寻址 操作数在某个固定的寄存器或固定的操作地址中。 立即数寻址 指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。 立即数寻址方式用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段。 实例 寄存器寻址方式 操作数在寄存器中,指令指定寄存器号。 对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。 对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。 这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。 存储器寻址 在IBM PC机中,把操作数的偏移地址称为有效地址EA 在存储器寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA,段地址通常在隐含的某个段寄存器中。由EU计算出EA,再由BIU根据PA=16*段首址+EA计算出实际地址,执行总线周期访问存储器,取得操作数,最后再执行指令规定的基本操作。 一条指令中,只能有一个存储器操作数(源操作数或目的操作数) 根据EA的计算方法,存储器寻址可分为以下几类: 直接寻址方式 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址加变址寻址 直接寻址方式 操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号两种形式),它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。 段地址隐含的由DS 指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址 或 ES:偏移地址。 图示 实例 寄存器间接寻址 寄存器间接寻址方式的操作数形式为:[reg] 操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。 PA=16*(DS)+ 或PA=16*(SS)+BP 也可以使用段前缀来取得其它段当中的操作数 实例 寄存器相对寻址 操作数在存储器内,指令中寄存器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。 有效地址的计算方法 (BX) DISP8 PA=16*(DS) + (SI) + (DI) DISP16 PA=16*(SS)+(BP)+ 实例: 设执行前: (AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H 执行指令:ADD 6[BX],AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=? 图示 执行:(20036H)+(AX) &(20036H) 执行后:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0090H。 基址变址寻址 基址变址寻址方式是在指令中给出一个基址寄存器名和一个变址寄存器名,两者内容之和作为操作数的有效地址。 基址寄存器为BX或BP,变址寄存器为SI或DI,但指令中不能同时出现两个基址寄存器或两个变址寄存器。 如果基址寄存器为BX,则段寄存器使用DS;如果基址寄存器用BP,则段寄存器用SS。 有效地址的计算方法 PA=16*(DS)+(BX)+ PA=16*(SS)+(BP)+ 基址变址寻址实例 如果 (DS)=2100H, (BX)= 0158H, (DI)=10A5H, EA=11FDH, 则执行指令 MOV AL,[BX][DI] 有效地址:EA=(BX)+(DI)=H=11FDH 物理地址:(DS) * 16 + 有效地址 =21000H+11FDH=221FDH 执行结果:将221FDH单元内容送入寄存器AL中。 相对的基址变址寻址 操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。 PA=16*(DS)+(BX)+ + PA=16*(SS)+(BP)+ + 相对的基址变址实例 已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H 指令: MOV AX,MK[BX][SI] 或 MOV AX,MK[BX+SI] 或 MOV AX,[MK+BX+SI] EA:MK+(BX)+(SI)=H+0100H =3250H PA:(DS)*16 +EA=3H=33250H 执行结果:将33250H单元内容送AL,33251H内容送AH。 段超越 当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。 段超越前缀形式为:段寄存器名: 例如: MOV AX,ES:[BP] ;段地址在ES MOV AX,CS:[BX] [SI] ;段地址在CS 段地址的基本约定和允许超越的情况 对8086内存寻址方式的注解 在汇编后,指令中的变量名有具体的偏移地址所取代。 在寄存器相对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。 在Microsoft宏汇编MASM中,内存操作数可以采用多种书写形式。 操作数中使用变量的地方也可以用下列形式: 变量名&整数表达式。 计算出的有效地址以16位表示,若超过0FFFFH,CPU将忽略所有溢出。 记忆8086内存操作数形式的简易方法如下: [BX] [SI] disp [BP] [DI] 每列选择0项或一项,构成至少一项,即可得到有效的内存操作数形式。 微机原理----汇编语言程序设计(4) 传送类指令 80X86的指令系统 数据传送类指令 算术运算类指令 逻辑运算与移位类指令 串操作类指令 控制转移类指令 处理器控制类指令 通用传送指令 传送指令MOV 堆栈操作指令PUSH和POP 数据交换指令XCHG 标志传送指令 读取标志指令LAHF 设置标志指令SAHF 标志寄存器的入栈和出栈指令PUSHF/POPF 地址&&目标传送指令 有效地址送寄存器 (Load Effective Address)LEA 指针送寄存器和DS的指令LDS 指针送寄存器和ES的指令LES 累加器传送指令 输入输出指令IN/OUT 查表指令XLAT 传送指令MOV 格式:MOV dst, src 功能:将src代表的源操作数的内容送到dst 代表的目标操作数去。源操作数的内容不变。 对标志位的影响:无 MOV的6种格式 从通用寄存器到通用寄存器 MOV reg1,reg2 立即数传送到通用寄存器 MOV reg ,data 通用寄存器和存储单元之间 MOV mem ,reg MOV reg,mem 立即数传送到存储单元 MOV mem, data 段寄存器与通用寄存器间的数据传送 MOV seg,reg MOV reg, seg 段寄存器与存储单元间的数据传送 MOV seg,mem MOV mem, seg 关于MOV指令的说明: 不允许两个操作数同时为段寄存器。 不允许两个操作数同时为存储器操作数。 立即数不能传送到段寄存器中。 目的操作数不允许使用CS段寄存器和指令指针寄存器IP。 立即数不能作为目的操作数。 dst与src必须类型匹配,即同时是字节或字类型。 寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。 若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。 有时MASM不能确定内存操作数的类型,需要用BYTE PTR或WORD PTR明确指出是字节或字类型。只要其中一个操作数的类型确定即可。 例:错误的MOV 指令如下所示: MOV AX,BL MOV DS,1000H MOV [BX] ,[SI] MOV ES,CS MOV CS,AX MOV [BX], 23 MOV 1000H, AL 例:设A和B是已定义的字节变量,以下是一些错误和正确的指令。 MOV AX,B MOV A,0 MOV BX, WORD PTR A 堆栈操作指令 堆栈&&存储器的一段区域,按&先进后出&的原则进行存出操作。系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。 作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。 微机原理----汇编语言程序设计(5) 算术运算类指令 算术运算类指令 加法指令 ADD ADC INC AAA DAA 减法指令 SUB SBB DEC NEG CMP AAS DAS 乘法类指令 MUL IMUL 除法类指令 DIV IDIV AAD CBW CWD 深入认识CF和OF CF表示无符号溢出,即运算结果超出了无符号数的表示范围。 OF表示带符号溢出,即运算结果超出了带符号数的表示范围。 CF和OF判断方法 加法 CF的判断方法 从十进制角度来看,若无符号加的结果大于2n-1(n为位数),则CF=1,否则CF=0。 从二进制角度来看,若结果最高位向前有进位,则CF=1,否则CF=0。 OF的判断方法 从十进制角度来看,若带符号加的结果不在范围-2n - 1~2n-1-1(n为位数)内,则OF=1,否则OF=0。 从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则OF=1,否则OF=0。 减法 CF的判断方法 从十进制角度来看,若无符号减数大于被减数,则CF=1,否则CF=0。 从二进制角度来看,若结果最高位向前有借位,则CF=1,否则CF=0。 OF的判断方法 从十进制角度来看,若带符号减的结果不在范围 -2n-1~2n-1-1(n为位数)内,则OF=1,否则OF=0。 从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则OF=1,否则OF=0。 加法指令 ADD ADC INC AAA DAA 不带进位加法 ADD dst,(dst)&(src)+(dst) 带进位加法 ADC dst,(dst)&(src)+(dst)+CF 说明: 这两条指令对OF,SF,CF,ZF,PF和AF均产生影响。 ADC指令中加的CF为该指令执行前的CF值。 ADC指令常用于两个多倍精度字的非最低字或非最低字节的相加。 除src为立即数的情况外,必须有一个操作数在寄存器中。 加1指令 INC 格式: INC opr 功能: 将opr中的内容加1。 说明: INC指令只影响OF,SF,ZF和PF,对CF没有影响。 opr可为寄存器或存储器操作数,当其为存储器操作数时,须指明操作数类型。 该指令常用于在循环结构程序中用来修改指针或循环计数。 计算机中十进制数的表示:BCD(Binary Coded Decimal)码 BCD是一种用二进制编码的十进制数,又称二&十进制数。它是用4位二进制数表示一个十进制数码的,由于这4位二进制数的权为8421,所以BCD码又称为8421码。 在IBM PC机里,表示十进制数的BCD码可以用组合的BCD码和非组合的BCD码两种格式表示。 组合的BCD码(packed BCD format)用4位二进制数表示一个十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。例如:9502d应表示为:00 0010。 非组合的BCD码(unpacked BCD format)则以8位为一组表示一个十进制数位,8位中的低4位表示8421的BCD码,而高4位则没有意义。例如:9502d应表示为:uuuu1001 uuuu0101 uuuu0000 uuuu0010。 组合十进制加法调整指令 语句格式:DAA 功能:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则(AL)=(AL)+6且(AF)=1;如果(AL)&=0A0H或(CF)=1,则(AL)=(AL)+60H且(CF)=1。同时,SF、ZF、PF均有影响。 说明: 该指令应跟在ADD或ADC指令之后,且加法指令的运算结果必须放在AL中。 例: 组合BCD码的加法运算。 MOV AL,68H ;(AL)=68H,表示压缩BCD码68 MOV BL,28H ;(BL)=28H,表示压缩BCD码28 ADD AL,BL ;二进制加法:(AL)=68H+28H=90H DAA ;十进制调整:(AL)=96H ;实现压缩BCD码加法:68+28=96 加法的非压缩BCD码调整指令AAA 语句格式:AAA 功能:如果AL的低4位大于9或(AF)=1,则: (AL)=(AL)+6 (AH)=(AH)+1 (AF)=(CF)=1 否则:(CF)=(AF)=0 AL高4位清零。 说明:该指令应跟在ADD或ADC指令之后,且加法指令的运算结果必须放在AL中。 减法运算指令 不带借位减法指令SUB 带借位减指令 SBB 减1指令DEC 求补指令NEG 比较指令 CMP 组合十进制数减法调整指令DAS 非组合十进制数减法调整指令AAS 不带借位减法指令SUB 语句格式:SUB dst,src 功能:目的操作数减源操作数,结果存于目的地址,源地址内容不变。即(dst)-(src)&(dst) 对标志位的影响:影响AF,CF,OF,PF,ZF,SF 带借位减指令 SBB 语句格式:SBB dst ,src 功能:目的操作数减源操作数再减低位借位CF,结果送目的地址。即(dst)―(src)―CF &( dst) 减1指令DEC 语句格式:DEC opr 功能:将目的操作数减1,结果送目的地址。即(opr)-1&(opr)。 说明: DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。 减1指令DEC也一般用于对计数器和地址指针的调整。 求补指令NEG 语句格式:NEG opr 功能:将操作数按位求反(包括符号位)后末位加1,结果送目的地址。即(opr)&-(opr) 说明: 只有当操作数为0时CF=0,其它情况则为使得CF=1。 当字节运算时对-128(即80H)求补以及字运算时对-32768( 即8000H)求补的情况下,结果仍为80H或8000H,此时OF=1,其余情况为0。 比较指令 CMP 语句格式:CMP dst,src 功能:目的操作数减源操作数,但不保存运算结果,只是根据结果影响标志位。即(dst)-(src)。 说明:该指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支。 语句格式:DAS 功能: 如果(AF)=1或AL寄存器中低4位大于9,则(AL)=(AL)-6且(AF)=1; 如果(AL)&=0A0H或(CF)=1,则(AL)=(AL)-60H且(CF)=1。 同时SF、ZF、PF均受影响。 例:压缩BCD码的减法运算。 MOV AL,68H ;(AL)=68H MOV BL,28H ;(BL)=28H SUB AL,BL ;二进制减法:(AL)=68H-28H=40H DAS ;十进制调整:(AL)=40H ;实现压缩BCD码减法:68-28=40 减法的非压缩BCD码调整指令AAS 语句格式:AAS 功能: 如果AL的低4位大于9或(AF)=1,则: (AL)=(AL)-6 (AH)=(AH)-1 (AF)=(CF)=1 否则:(CF)=(AF)=0 AL高4位清零。 其他标志位OF、PF、SF、ZF不确定。 乘法运算指令 无符号数乘法指令MUL 有符号乘指令IMUL 无符号数乘法指令MUL src为字节数:AX & (AL)* (src) src为字,(DX,AX )& (AX) * (src) 说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 乘法指令对除CF和OF以外的状态标志位无定义。 两字节数相乘,若乘积的高字节不为0(即(AH)&0),则CF=OF=0,否则,CF=OF=1。 两字数相乘,若乘积的高位字不为0(即(DX)&0),则CF=OF=0,否则,CF=OF=1。 带符号数乘法指令IMUL 语句格式: IMUL src 功能: src为字节数:AX & (AL)* (src) , src为字,(DX,AX )& (AX) * (src) 说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 乘法指令对除CF和OF以外的状态标志位无定义。 两字节数相乘,若乘积的高字节是低字节的符号扩展,则CF=OF=0,否则,CF=OF=1。 两字数相乘,若乘积的高位字是低位字的符号扩展,则CF=OF=0,否则,CF=OF=1。 非组合十进制数乘法调整指令AAM 格式:AAM 功能: 将AX中的被除数调整成二进制数,并放在寄存器AL中。该指令执行的操作是: (AL)&10*(AH)+(AL) (AH) &0 说明: 该指令对PF,SF,ZF产生影响,对OF,AF和CF无定义。 无符号数除法指令DIV 格式:DIV src 功能: src为字节数:AL & (AX)&(src)的商 AH& (AX)&(src)的余数 src为字:(AX)& (DX,AX ) & (src) 的商 (AX)& (DX,AX ) & (src) 余数 说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 乘法指令对所有状态标志位无定义。 带符号数除法指令IDIV 格式:IDIV src 功能: src为字节数:AL & (AX)&(src)的商 AH& (AX)&(src)的余数 src为字:(AX)& (DX,AX ) & (src) 的商 (AX)& (DX,AX ) & (src) 余数 说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 操作数为带符号数,商和余数也是带符号数,且余数的符号和被除数的符号相同。 若src为字,则商的范围为-3;若src为字节数,则商的范围为-128~+127,如果超出范围,8086CPU将作为除数为0的情况处理,产生0号除法错中断,而不是用OF=1表示。 字节转换成字指令CBW 语句格式:CBW 功能:将AL中的符号位数据扩展至AH。 将字转换成双字指令CWD 语句格式:CWD 功能:将AX中的符号位数据扩展至DX 。 说明: 这两条指令均不影响状态标志位。 对于无符号数的扩展,只需要高位字节或高位字置0即可。 非组合十进制数除法调整指令AAD 格式:AAD 功能: 对8位的非组合BCD码的乘积(AX)的内容进行调整。调整后的结果仍为一个正确的非组合BCD码,放回AX中。 说明: 该指令对PF,SF,ZF产生影响,对OF,AF和CF无定义。 与AAA,AAS,AAM不同,该指令应在除法指令前执行。 写出执行以下计算的指令序列。其中X、Y、Z、R、W均为存放16位带符号数单元的地址 Z&W+(Z-X) Z&W-(X+6)-(R+9) Z&(W*X)/(Y+6),R&余数 微机原理----汇编语言程序设计(6) 逻辑运算类指令 逻辑运算指令 8086的逻辑运算指令包括AND(与),OR(或),NOT(非),XOR(异或)指令和TEST(测试)指令。 AND,OR和XOR指令的使用形式很相似,它们都是双操作数指令,即可对8位数操作,也可对16位数操作。除源操作数可为立即数外,在两个操作数中至少有一个为寄存器,另一个则可使用任意寻址方式。 以对状态标志的影响:NOT不影响标志位,其他4条指令将使CF和OF置0,AF无意义,而ZF、SF和PF则根据运算结果进行设置。 求反指令NOT 语句格式:NOT opr 功能:将目的地址中的内容逐位取反后送入目的地址。即(opr)&opr 【例4.21】逻辑非运算。 MOV AX,878AH ;(AX)=878AH NOT AX ;(AX)=7875H 逻辑与指令AND 语句格式:AND dst, src 功能:将目的操作数和源操作数进行逻辑与运算,结果存目的地址。(dst)&(src)&(dst)。 该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:1&1=1,1&0=0,0&1=0,0&0=0 例:将AL中第3位和第7位清零。 MOV AL,0FFH AND AL,77H 测试指令TEST 语句格式:TEST dst,src 功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。 即(dst)&(src)。 例:测试AX中的第12位是否为0,不为0则转L。 TEST AX,1000H JNE L 逻辑或指令OR 语句格式:OR dst,src 功能:将目的操作数和源操作数进行逻辑或运算,结果存目的地址。即(dst)&(src)&dst 。 说明:该指令可用于将dst中的某些位置1 。 例:将AL寄存器中第3位和第7位置1。 MOV AL,0 OR AL,88H 逻辑异或指令XOR 语句格式: XOR dst,src 功能:目的操作数与源操作数进行按位异或运算,结果送入目的地址。 即(dst)&(src) &(dst)。 说明:该指令可将dst的某些位按位求反。 例:异或运算。 MOV AL,45H ;(AL)=45H XOR AL,31H ;(AL)=74H 小结 在程序设计中,一般用AND指令对一个数据的指定位清0。例如,AND AL,0FH指令就实现将高4位清0。 OR指令常常用来对一些指定位置1。 XOR指令常常用在一些程序的开头使某个寄存器清0,以配合初始化工作的完成。例如,XOR AX,AX,使累加器清0。 NOT指令常用来将某个数据取成反码,再加上1,便得到补码。 TEST指令一般用来检测指定位是1还是0。 填空,完成如下功能的指令: AX,AX ;将AX的内容清0; AX, ;将AX的高四位清0; AX, ;将AX的第3、7位置1 AX, ;将AX的第3、7位求反 移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。 格式:操作符 opr,1 或 操作符 opr,CL 功能:将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。 说明: 目的操作数是8位(或16位)的寄存器数据或存储器数据。 如果只移1位,那么,指令中直接用1指出移动位数;如果左移或右移若干位,那么必须用CL寄存器预先指定所移的位数。 非循环移位指令 8086指令系统中有4条移位指令: 算术左移指令SAL(shift arithmetic left) 逻辑左移指令SHL(shift logic left) 算术右移指令SAR(shift arithmetic right) 逻辑右移指令SHR(shift logic right)。 算术左移和逻辑左移指令SAL(SHL) 格式:SAL opr,1 或SHL opr,1 SAL opr,CL或SHL opr,CL 功能:将(opr)向左移动CL指定的次数,最低位补入相应的0, CF的内容为最后移入位的值。 算术右移指令SAR 格式:SAR opr,1或SAR opr,CL 功能:将(opr)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。 逻辑右移指令SHR 格式:SHR opr,1或SHR opr,CL 功能:将(opr)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。 逻辑移位指令在执行时,实际上是把操作数看成无符号数来进行移位,所以右移时,最高位添0; 算术移位指令在执行时,则将操作数看成有符号数来进行移位,所以,右移时保持最高位的值不变,这里的最高位就是符号位。 所有的移位指令在执行时,都会影响标志位CF,OF,PF,SF和ZF。 循环移位指令 不带进位位的循环左移指令ROL(rotate left) 不带进位位的循环右移指令ROR(rotate right) 带进位位的循环左移指令RCL(rotate through CF left) 带进位位的循环右移指令RCR(rotate through CF right)。 循环左移指令ROL 格式:ROL opr,1或ROL opr,CL 功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。 循环右移指令ROR 格式: ROR opr,1或ROR opr,CL 功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。 带进位的循环左移指令RCL 语句格式: RCL opr, 1或RCL opr,CL 功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。 带进位的循环右移指令RCR 格式:RCR opr,1或RCR opr,CL 功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。 用移位指令时,左移1位相当于将操作数乘2,右移1位相当于将操作数除2。用乘法指令和除法指令来直接执行乘、除运算,一般所需要的时间比较长,如果用移位指令来编制一些常用的乘除法程序,由于移位指令执行速度快,所以常常可以将计算速度提高五、六倍之多。 汇编语言程序设计(7) 串操作类指令 串操作类指令 串操作就是对存储区中连续存放的字节或字进行操作。 通过加重复前缀来实现串操作。 可以对字节串进行操作,也可以对字串进行操作。 所有的串操作指令都用寄存器SI对源操作数进行间接寻址,并且假定是在DS段中。 所有的串操作指令都用寄存器DI为目的操作数进行间接寻址,并且假定是在ES段中。 当DF=1时,SI和DI作自动减量修改,当DF=0时,SI和DI作自动增量修改。 重复前缀 REP REPE/REPZ REPNE/REPNZ 无条件重复前缀REP 功能: 若(CX)=0,则结束串操作,执行下一条指令,否则进行步骤②; (CX)&(CX)-1; 执行后跟的串操作指令 重复①~③。 REPE/REPZ 功能: 若(CX)=0或ZF=0,则结束串操作,执行下一条指令,否则进行步骤②; (CX)&(CX)-1; 执行后跟的串操作指令 重复①~③。 REPNE/REPNZ 功能: 若(CX)=0或ZF=1,则结束串操作,执行下一条指令,否则进行步骤②; (CX)&(CX)-1; 执行后跟的串操作指令 重复①~③。 串传送指令(Move String) 格式: MOVS dst,在操作数中表明是字或字节操作 MOVSB ;(字节) MOVSW ;(字) 功能: ①(DS:[SI])&ES:[DI]。 ② 当DF=0时,(SI)和(DI)增量。 当DF=1时,(SI)和(DI)减量。 说明: 实际上MOVS的寻址方式是隐含的,所以这种格式中的dst和src 只提供给汇编程序作类型检查用。 该指令不影响状态标志位。 实例:用串传送指令将100个字从AREA1传送到AREA2。 程序段1(不加REP): MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 CLD AG:MOVSW DEC CX JNZ AG 程序段2(加REP): MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 CLD REP MOVSW 使用MOVSB/MOVSW前应做好以下准备工作: 数据段中源串的首地址(如反向传送则是末地址)放入SI中; 附加段中目的串首地址(如反向传送则是末地址)放入DI中; 数据串的长度送入CX 建立方向标志(可用STD指令将DF置1或用CLD指令将DF清0) 注意: 如果源字符串与目标字符串部分重迭,则传送方向要特别注意,如果源字符串的地址低于目标字符串的地址,则应该自动减量(DF=1);如果源字符串的地址高于目标字符串的地址,则应该自动增量(DF=0)。 存入串指令(Store String) 格式:① STOSB&&往字节串中存数 ② STOSW&&往字串中存数 ③ STOS dst 功能: ① 字节操作:(AL)&[DI] 字操作:(AX)&[DI]。 ② 修改指针DI,使之指向串中的下一个元素。 当DF=0时,(DI)增量。 当DF=1时,(DI)减量。 说明: 该指令不影响标志位。 STOS指令在初始化某一缓冲区时很有用。 例:要把附加段中的从BUF单元开始的100个字节置为20H。 从源串中取数指令LODS 格式:① LODSB&&从字节串中取数 ② LODSW&&从字串中取数 ③ LODS src 功能: ① 字节操作:([SI])&AL 字操作:([SI])&AX。 ② 修改指针SI,使它指向串中的下一个元素。 当DF=0时,(SI)增量; 当DF=1时,(SI)减量。 说明: 该指令不影响状态标志位; 该指令一般不与REP联用,有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令。 例:设内存中有一字符串,起始地址为BLOCK,其中有正数和负数,要将其中的正数送入PLUS为首址的存储区。 DATA SEGMENT BLOCK DB -1,5,7,-3,8,2,48,32 COUNT EQU $-BLOCK PLUS DB COUNT DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA MAIN:MOV AX, DATA MOV DS,AX MOV ES,AX MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS MOV CX,COUNT AG:LODSB TEST AL,80H JNZ NEXT STOSB DEC CX JNZ AG MOV AH,4CH INT 21H CODE ENDS END MAIN 串比较指令CMPS 格式: ① CMPSB&&字节串比较 ② CMPSW&&字串比较 功能: ①([SI])-([DI])。 ② 修改串指针,使之指向串中的下一个元素。 当DF=0时,(SI)和(DI)增量。 当DF=1时,(SI)和(DI)减量。 说明: 该指令影响所有的状态标志位 该指令可与REPE/REPZ或REPNE/REPNZ相结合判断两字符串是否相同。 例:比较DS段中从AREA1开始的字节串与ES段中AREA2开始的字节串是否相同,设串长度为5。若不一样,找出出现不一样时的位置,并记入DS段中的POINT单元。 串搜索指令SCAS 格式: ① SCASB&&字节串搜索 ② SCASW&&字串搜索 功能: ① 字节操作:(AL)-([DI]) 字操作:(AX)-([DI]) ② 修改指针使之指向串中的下一个元素 当DF=0时,(DI)增量 当DF=1时,(DI)减量 说明: 该指令影响所有的状态标志位 该指令可与REPE/REPZ或REPNE/REPNZ相结合从一个字符串中查找一个指定的字符。 例:在NUM单元存放有一个字节数,在DS段中从X开始的字节串中搜寻,若NUM与字节串中的某数相同,则记下字节串中该数的偏移地址,并将其送入ADDR中,设字节串的长度为8。 微机原理----汇编语言程序设计(8) 控制转移类指令 知识点: 控制转移类指令 无条件转移指令JMP 调用指令CALL 返回指令RET 条件转移指令 循环控制指令 重点:条件转移类指令;循环控制指令 难点:转移地址的寻址;条件转移类指令的应用; 学习方法: 将转移地址的寻址与前面所学的操作数的寻址方式进行对比,在比较的过程中进一步领会这两种寻址的实际含义; 条件转移指令共有19条,用分类的方法以及每一条指令的英文名称结合记忆; 对于条件转移类指令和循环控制类指令的应用,主要还是要多读相关例程和多写程序。 转移可以分成两类:段内转移和段间转移。 段内转移是指在同一段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的。其类型用NEAR来表示。为了进一步节省目标码的长度,对于很短距离内的段内转移(-128~+127),86系列又把它进一步分别开来,称为短转移,用SHORT来表示。 段间转移则是要转到另一个段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成 。其类型用FAR来表示。 转移地址的寻址 直接转移,就是转移的目标地址信息直接出现在指令的机器码。 间接转移,就是转移的目标地址信息间接存储于某一个寄存器中或某一个内存变量中。当通过寄存器间接转移时,因为寄存器只能是16位的,所以只能完成段内间接转移。 无条件转移指令 JMP 段内直接转移 格式: JMP NEAR PTR 标号 JMP SHORT 标号 操作:(IP)&(IP)+ 说明: 如果位移量为16位,则在符号地址前加操作符NEAR PTR;如果位移量为8位,则在符号地址前加操作符SHORT。 位移量=转向有效地址-当前IP值 这种方式是一种相对寻址方式。可实现程序的浮动装配。 示例:位移量的计算。 段内间接转移 格式:JMP WORD PTR opr 操作:(IP) & (有效地址) 说明: 转向的有效地址是一个寄存器或一个字单元的内容。并以此内容取代IP指针的内容。 例: JMP BX JMP WORD PTR [1000H] 段间直接(远)转移 格式: JMP FAR PTR 标号 操作:(IP)&标号的偏移地址 (CS)&标号的段地址 段间间接转移 格式: JMP DWORD PTR opr 操作:(IP)&(EA) (CS)&(EA+2) 说明:opr必须为存储器操作数。 调用指令CALL 段内直接调用 格式: CALL opr 操作: (IP)&(SP)-2; ((SP)+1,(SP))&(IP); (IP)&(IP)+D16; 注:转移地址的寻址方式为段内直接寻址。 例: CALL NEAR PTR SUB1 CALL [1000H] 段内间接调用 格式: CALL opr 操作: (SP)&(SP)-2; ((SP)+1,(SP))&(IP); (IP)&(opr) 例: CALL BX CALL WORD PTR [SI] 段间直接调用 格式: CALL DST 操作: (SP)&(SP)-2; ((SP)+1,(SP))&(CS); (SP)&(SP)-2; ((SP)+1,(SP))&(IP); (IP)&偏移地址(指令的第2,3个字节); (CS)&段地址(指令的第4,5个字节)。 例: CALL FAR PTR SUBT CALL 2500H:1400H 段间间接调用 格式: CALL dst 操作: (SP)&(SP)-2; ((SP)+1,(SP))&(CS); (SP)&(SP)-2; ((SP)+1,(SP))&(IP); (IP)&(EA); (CS)&(EA+2) 例:CALL DWORD [DI] 返回指令RET 段内返回 格式:RET 操作: (IP)& ((SP)+1,(SP)) (SP)&(SP)+2 段内带立即数返回 格式: RET n; 操作: (IP)&((SP))+1,(SP)) (SP)&(SP)+2 (SP)&(SP)+n 段间返回 RET (IP)&((SP)+1,(SP)) (SP)&(SP)+2 (CS)&((SP)+1,(SP)) (SP)&(SP)+2 段间带立即数返回 RET n; (IP)((SP)+1,(SP)) (SP)(SP)+2 (CS)((SP)+1,(SP)) (SP)(SP)+2 (SP)(SP)+DISP16位移量 条件转移指令 简单条件转移指令 无符号数条件转移指令 有符号数条件转移指令 格式:[ 标号:] 操作符 短标号 功能: 状态标志作为转移的条件,当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。 作为判断条件的状态标志位有:CF、PF、ZF、SF和OF。 说明:条件转移指令只能实现短跳转。 简单条件转移指令 无符号数条件转移指令 带符号数条件转移指令 循环控制指令(短转移) LOOP(LOOP) 格式:LOOP OPR 条件:(CX)&0 LOOPZ/LOOPE 格式:LOOPZ(或LOOPE) OPR 条件:ZF=1且(CX)&0 LOOPNZ/LOOPNE 格式:LOOPNZ(或LOOPNE) OPR 条件:ZF=0且(CX)&0 微机原理----汇编语言程序设计(9) 结构与记录 结构:相互关联的一组数据的某种组合形式。 结构的定义 格式: 结构名 STRUC <数据定义语句序列> 结构名 ENDS 例: STUDENT STRUC && NAMEI DB& 'ABCD& &&&&&&& NO DB ? ENGLISH DB ? & MATHS DB ? &PHYSIS DB ? STUDENT ENDS STUDENT叫做结构名,结构内数据定义语句中的变量名叫做结构字段名,如 NAMEI、NO、ENGLISH、MATHS和 PHYSICS都是结构字段名。 结构的预置 格式 结构变量名 结构名&字段值表& 其中: ①结构名是结构定义时用的名字。 ②结构变量名是程序中具体使用的变量,它与具体的存储空间及数据相联系,程序中可直接引用它。 ③字段值表用来给结构变量赋初值,表中各字段的排列顺序及类型应与结构定义时一致,各字段间以逗号分开。 例:S1 STUDNT<&ZHAN&,10,70,60,90> 通过预置进行结构变量的初始化的限制和规定: ①在结构定义中具有一项数据的字段才能通过预置来代替初始定义时的值,而用DUP定义的字段或一个字段后有多个数据项的字段,则不能在预置时修改其定义时的值。 例如: DATA STRUC & AI DB 29H ;简单元素,可以修改 & A2 DB 20,30 ;多重元素,不能修改 & A3 DW ? ;简单元素,可以修改 & A4 DB 'ZXC' ;可用同长度的字符串修改 & A5 DW 20 DUP (?) ;多重元素,不能修改 DATA ENDS ②若某些字段的内容采用定义时的初值,则在预置语句中这些字段的位置仅写一个逗号即可。若所有的字段都如此,则仅写一对尖括号即可。 例: S1 STUDNT<&ZHAN&,10,70,60,90> S2 STUDENT<&WANG&,12,80,70,75> S3 STUDENT<&LONG&,15,92,83,78> 或者 SI STUDENT<> S2 STUDENT<> S3 STUDENT<> 或者: S STUDENT 3DUP(<>) 结构的引用 程序中引用结构变量,可直接写结构变量名。 引用结构变量中的某一字段,则采用如下形式: 结构变量名.结构字段名 先将结构变量的起始地址的偏移量送某个地址寄存器,再用: [地址寄存器].结构字段名 例如,若要引用结构变量SI中的ENGLISH字段,则以下两种用法都是正确的; ① MOV AL,SI.ENGLISH ② MOV BX,OFFSET SI MOV AL,[BX].ENGLISH 由此看到,若需要查询某个学生的某门成绩,利用结构来做就很简单方便,而不必去计算这个数据的地址。 例:有三个学生的姓名、学号及 ENGLISH成绩用结构的形式存入在内存中,试编程显示出ENGLISH不及格的学生的姓名。 DATA SEGMENT &STUDENT STRUC&&& ;定义结构 && NAME1 DB &ABCD& &&&&& NO DB ? &ENGLISH DB? &STUDENT ENDS &&&&& S1 STUDENT<&ZHAN&,10,80> &&&&& S2 STUDENT<'WANG&,20,76> &&&&& S3 STUDENT<'LI&,23, 56> &DATA ENDS &CODE SEGMENT &&&&& ASSUME CS:CODE,DS:DATA START PROC FAR PUSH DS&& MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX&&&&&&&&&&&&&&&& MOV DH, 3 MOV BX, OFFSET SI&&& BEGIN:MOV AL,[BX].ENGLISH CMP AL, 60 JGE NOSHOW&&&& MOV CX,4 SHOW:MOV DL,[BX]. NAME1&&& MOV AH, 2 INT 21H INC BX LOOP SHOW SUB BX,4 NOSHOW:ADD BX,6 &&&&&&&&&&&&&&DEC DH JNZ BEGIN RET& START ENDP &CODE ENDS &&&&& END START 记录是用于定义和处理以位为计算单位的信息组。 记录的定义 记录名 RECORD <字段名>:宽度〔一表达式〕[,&&&] 说明: ①记录名和字段名是必写的。一个记录至少得有一个字段,若有多个字段,字段间用逗号分隔。 ②宽度代表相应字段所占的位数,取值1~16位。 ③宽度后的表达式是任选项,它是给相应字段赋的初值。表达式的值应是一个该字段能容纳下的正整数,若缺省,该字段的初值为 0。 关于字段的宽度和记录的总宽度,有几点需要说明如下: ①各字段的宽度之和应在 1~ 16之间。 ②如果记录的总宽度大于8位,那么汇编程序将该记录按字处理,否则按字节处理。 ③如果记录的总宽度少于8位或16位,那么所有字段就靠右对齐到字节或字的最低有效位置。 ④如果某字段的位数为7(或8),则可定义为一个字符。 例如,用一个记录来描述某人。设姓名占3位,性别占1位,籍贯占3位,健康状态占1位。 STUDENT RECORD NA:3,SEX:1,AD:3,STAU:1 记录的预置 格式:记录变量名记录名<字段值表> 设有一学生其姓名缩写编码为 101;性别为男,用 1表示;籍贯编码为111;健康状态为1,表示健康,则这个学生的记录预置如下; S1 STUDENT<101B,IB,111B,1B> 这样,存储器中便分配了一个字节,存放有 S1记录变量的信息。 记录运算符WIDTH、MASK和记录字段名。 WIDTH: 求得记录或记录字段所占的位数。 格式:WIDTH记录名或记录字段名 例如,WIDTH STUDENT ; =8 WIDTH ADDI ; =3 MASK可标识一个记录字段在记录中占有哪几位。 格式:MASK 记录字段名 例: MASK NAMEI ;=。 MASK ADDI ;=00001l10 MASK SEX ;= MASK STAU ;= 记录字段名:表示该字段移位到该记录的最有边所需要的移位次数。 例 MOV AL, NAME1 ; AL~ 5 MOV AH, ADD1 ; AH~ 1 MOV BH, STAU ; BH~0 以上的记录运算符可以与逻辑运算符NOT、OR、AND以及算术运算符SHL(左移)和SHR(右移)配合使用。 例:已知三个学生的情况分别放在记录变量 SI, SZ和 S3中,试编程将其中男同学进行计数。 DATA SEGMENT STUDENT RECORD NA:3,SEX:1,AD:3,STAU:1 S1 STUDENT<111B,1B,101B,1B> S2 STUDENT<001B,0B,100B,1B> S3 STUDENT<100B,1B,10 IB,1B> DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS : DATA START PROC FAR PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS,AX MOV CL,3 MOV CH,0 MOV BX,OFFSET S1 BEGIN:MOV AL,[BX] TEST AL,MASK SEX JZ COUNT INC CH COUNT:INC BX DEC CL JNZ BEGIN RET START ENDP CODE ENDS END START 宏指令 宏指令的定义 macro name macro [dummy parameter list] ┇ (宏定义体) ENDM 宏调用 macro name [actual parameter list] 宏展开 当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且用实在参数取代宏定义中的形式参数。 例:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数,作为结果 宏定义: MULTIPLY MACRO opr1,opr2,RESULT PUSH DX PUSH AX MOV AX,opr1 IMUL opr2 MOV RESULT,AX POP AX POP DX ENDM 宏调用: ┇ MULTIPLY CX,VAR,XYZ[BX] ┇ MULTIPLY 240,BX,SAVE ┇ 宏展开: + PUSH DX + PUSH AX + MOV AX,CX + IMUL VAR + MOV XYZ[BX],AX + POP AX + POP DX ┇ + PUSH DX + PUSH AX 宏定义可以无参数宏定义 例: SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM 宏调用: SAVEREG 取消宏指令的伪指令PURGE 格式:PURGE &宏指令名1&,&宏指令名2& 功能:取消宏指令 说明:宏指令一经定义,在整个程序中有效。若宏指令名与指令或伪指令助记符相同时,则宏指令优先级更高,同名指令或伪指令失效。因此一般情况下,不使用指令及伪指令助记符作为宏指令名。若出现这种情况,也应在一定时候取消宏指令,使失效的指令或伪指令恢复功能 定义局部标号伪指令LOCAL 格式:LOCAL 标号1,标号2,& 功能:展开还原宏指令时,用??0000~??FFFF的编号来代替这些标号. 说明:在定义宏指令时,宏体中可能出现标号,当宏指令在程序中多次被调用时,这些标号便在多处出现,汇编程序将指出&标号重复定义&的错误。可用LOCAL指令来避免这一错误。 用一条宏指令完成延时。延时的基本单位是10ms,参数X使宏指令完成X*10ms的延时。源程序如下: DELAY MACRO X LOCAL DELAY1,WAIT1 MOV BL,X DELAY1:MOV CX,2942 WAIT1:LOOP WAIT1 DEC BL JNZ DELAY1 ENDM ┇ DELAY 100 ;宏调用 ┇ DELAY 10 ;再次调用 宏展开 + MOV BL ,100 + ??0000:MOV CX,2942 + ??0001:LOOP ??0001 + DEC BL + JNZ ??0000 ┇ + MOV BL ,10 + ??0002:MOV CX,2942 +??0003: LOOP ??0003 + DEC BL + JNZ ??0002 微机原理----汇编语言程序设计(10) 程序设计的基本方法及简单程序设计 学习目标: 对用汇编语言编程的基本方法及特殊性有一个较清晰的认识; 熟悉几种常用的程序结构的编程; 对一般难度的汇编语言程序能熟练编写; 对具有一定综合性的、一定难度的程序编制,经过思考也能完成。 系统说明 输入定义 输入量是何种信息? 输入何时准备好,CPU如何知道输入已准备好?采用什么方式输入? 该输入是否有自己的时钟信号,是否需要CPU提供软件定时? 输入信号是否由接口锁存?如果不锁存,该信号能保持多长时间供 CPU读取? 输入信号多长时间变化一次?CPU如何知道这种变化,并及时响应。 输入数据是否是个数据序列(数据块),是否需要校验?若校验出错,应作何处理? 该输入是否同其它的输入或输出有关系? 输出定义 输出量是何种信息? CPU如何知道输出设备已准备好? 输出信息是否需锁存?外部设备要求CPU的输出保持多长时间? 输出信息多长时间变化一次,外部设备如何知道这种变化?是否能及时反应? 输出信息是否为数据序列,输出顺序是否有严格的限制,是否需要采用校验措施? 该输出同其它输入或输出是否有关系? 系统存储器的说明 本微计算机应用系统是否采取存储器掉电保护措施。 系统存储器资源如何管理,工作区域如何划分。 采用何种软件结构最容易做到只改换一两片 ROM就能改变系统的软件功能。 如何使用只读存储器。 程序处理阶段的说明 应用系统中算术逻辑运算的比重 采用的基本算法 所用的指令类型及指令出现的概率 结果的精确程度,处理时间的限制 内存空间的节省等。 使用哪些监控程序  出错处理和操作的说明 可能发生什么类型的错误,哪些错误是最经常出现的错误? 系统如何才能以最低限度的时间和数据损失来排除错误。对错误处理的结果,以何种形式记录在案或显示? 哪些错误或故障会引起相同的不正常现象?如何区分这些错误或故障。 为了方便查找故障源,是否需要研制专用测试程序和诊断程序。 操作因素 程序设计 首先要分析问题,弄清需求: &程序的功能 &功能完成上有什么要求 &有哪些数据,数据的类型是怎样的 &已有系统的基础有哪些 确定算法,绘制流程图,包括确定数据结构及数据定义、分配存储单元及工作单元 编程 静态检查与调试 文档管理 维护与再设计 编码 所谓编码就是选择一种合适的程序设计语言来实现各模块的功能。 以CPU指令系统和汇编程序为基础的汇编语言进行程序设计,不仅可以提高工作系统的运行速度,提高内存利用率,而且可以明确地作用于机器的各个部件,是一种易于了解系统软硬件配合工作的程序设计语言。 查错和调试 查错和调试是软件研制很关键的一步。各个模块可以独立编写和调试,调试完后,再把它们连接起来形成一个完整的程序。有些微机应用系统的软件需要存放在ROM或EPROM中,在存入之前必须进行查错,调试和仿真运行后方可写入。 文件编制 总流程图; 程序功能的书面说明; 所有参量的定义清单; 存储器分配图; 完整的程序清单和注释; 测试计划和测试结果的说明 维护和再设计 汇编语言和高级语言的比较 汇编语言程序设计的特点 在算法的实现上,由于汇编语言指令功能较弱,因此考虑的问题要细小的多,层次要低得多。因此,对指令集功能既要有一个较全面的宏观上的把握,又要对指令的执行有一个微观上的理解。 变量的具体存储格式需要搞得很清楚,还要进行具体的内存分配。 在很多汇编语言程序中,需要考虑时序问题,因为涉及到硬件的控制。 程序的的基本结构 顺序结构 分支结构 循环结构 算术运算: 编程计算z=(x2-3y)/2。设x,y为单字节正整数,结果z用2个字节来存放。 DATA&&& SEGMENT X&&&&&& DB 25 Y&&&&&& DB 32 Z&&&&&& DW ? DATA&&& ENDS CODE&&& SEGMENT ASSUME& CS:CODE,DS:DATA EXPRE&& PROC FAR START: PUSH DS&&&&& &&&&&&& SUB AX,AX &&&&&&& PUSH AX &&&&&&& MOV AX, DATA &&&&&&&&&& MOV DS,AX && MOV AL,X &&&&&&& MUL AL&&&&nbsp
课件下载:
页数:150页
课件大小:0.24 MB
上传时间: 16:36:09
下载次数:
所需金币:0个
你可能感兴趣的,与“汇编语言课件(1)—汇编语言程序设计基础知识”相关的内容
课件标题:
课件地址:
搜索范围:百度 本站
相关课件下载

我要回帖

更多关于 汇编语言 加法 的文章

 

随机推荐