汇编语言程序设计基本方法
- 格式:pdf
- 大小:248.83 KB
- 文档页数:17
汇编语言程序设计基本命令汇编语言是一种底层的编程语言,直接操作计算机硬件,其指令由一系列的机器码组成。
在汇编语言程序设计中,我们需要了解一些基本的命令,包括数据传送指令、算术运算指令、控制转移指令等,下面就对这些命令做一详细的介绍。
1.数据传送指令在汇编语言中,数据传送指令用来将数据从一个位置复制到另一个位置,常用的数据传送指令有MOV、LEA和XCHG。
-MOV指令:将源操作数的值复制给目标操作数,格式为MOV目标操作数,源操作数。
-LEA指令:用来将有效地址(即内存中的地址)传送给寄存器,格式为LEA目标操作数,源操作数。
-XCHG指令:交换两个操作数的值,格式为XCHG目标操作数,源操作数。
2.算术运算指令在汇编语言中,我们可以使用一系列算术运算指令来对数据进行运算和处理,常见的算术运算指令有ADD、SUB、MUL和DIV等。
-ADD指令:用于进行加法运算,格式为ADD目标操作数,源操作数。
-SUB指令:用于进行减法运算,格式为SUB目标操作数,源操作数。
-MUL指令:用于进行乘法运算,格式为MUL目标操作数,源操作数。
-DIV指令:用于进行除法运算,格式为DIV目标操作数,源操作数。
控制转移指令用于改变程序的执行流程,常见的控制转移指令有JMP、JZ、JE、JNE等。
-JMP指令:用于无条件地跳转到目标地址继续执行,格式为JMP目标地址。
-JZ指令:用于当结果为零时跳转到目标地址继续执行,格式为JZ目标地址。
-JE指令:用于当结果相等时跳转到目标地址继续执行,格式为JE目标地址。
-JNE指令:用于当结果不相等时跳转到目标地址继续执行,格式为JNE目标地址。
4.逻辑运算指令逻辑运算指令用于对数据进行逻辑运算,常见的逻辑运算指令有AND、OR、XOR和NOT等。
-AND指令:对两个操作数的对应位进行与运算,格式为AND目标操作数,源操作数。
-OR指令:对两个操作数的对应位进行或运算,格式为OR目标操作数,源操作数。
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第4章 汇编语言程序设计基本方法4.1 学习指导详细介绍8086、8088 CPU指令系统的使用,包括指令的功能、寻址方式及其书写格式、对标志位的影响、使用注意事项。
对汇编程序设计所必需的伪指令进行详细讨论,说明了汇编程序的完整结构。
通过由易到难、由浅到深的大量例子介绍了顺序结构、分支结构、循环结构和子程序设计的基本方法,通过学习掌握变量、常量及伪指令的使用和一些常用的基本程序设计方法。
在分支程序设计中,要特别注意每个分支的完整性和分支条件的合理使用;在循环程序设计中,掌握循环程序的基本结构,特别注意应避免出现死循环;在子程序设计中,着重掌握参数的各种传递方式及其实现,对堆栈这种特殊的存储区域进行了详细的描述,切实掌握堆栈的使用。
宏指令与字符串操作是汇编语言设计中的两个难点,教材中对此也作了详细的介绍,要求掌握正确使用宏指令和字符串操作指令。
教材中简要介绍了DOS功能调用的使用方法和常用的一些DOS功能,要求能熟练使用INT 21H 的01,02,09,0AH,4CH号等功能。
4.2 补充知识1. 伪指令DW,DD的特殊用法变量名1 DW 标号(或变量名2)±常数变量名3 DD 标号(或变量名4)±常数定义的<变量名1>为字型地址指针,其内容为<标号±常数>或<变量名2±常数>的段内偏移地址;定义的<变量名3>为双字型地址指针,其内容为<标号±常数>或<变量名4±常数>的段内偏移地址和段地址, 例如:AD1 DB 100 DUP(?) ;设变量AD1逻辑地址为0100:2157 AD2 DW AD1 ;变量AD2内容为:2157HAD3 DD AD1 ;变量AD3内容为:2157H,0100H2. MOV指令传送图MOV指令可在立即数、通用寄存器、段寄存器、存储器之间传送数据,其传送路径可参见教材的图4.3。
需要特别注意的是,利用MOV指令不能直接传送的路径有5条:(1)立即数→段寄存器;(2)存储单元→存储单元;(3)段寄存器→段寄存器;(4)其它→CS;(5)其它→立即数。
除最后两条路径外,前三条路径可分两步实现,例如要将立即数12A6H传送到段寄存器DS,应分两步:MOV AX,12A6HMOV DS,AX需要说明的是,MOV指令的这种传送路径也适用于其它的双操作数指令,如ADD,ADC,SUB,SBB等指令。
3. 操作数类型对于一个操作数的类型,下列几点值得注意:(1)立即数无类型;(2)不含变量名的直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、基址变址且相对寻址的操作数为无类型;(3)利用PTR操作符可暂时改变存储单元的类型。
对于双操作数指令,两个操作数的类型必须匹配:(1)两者都指定了类型,则必须一致,否则指令出错(类型不一致);(2)两者之一指定了类型,一般指令无错;(3)两者都无类型,则指令出错(类型不定)。
4. 汇编语言指令在汇编语言程序设计中,有三类指令:指令、伪指令和宏指令。
指令:汇编后形成一条机器语言指令,指示CPU进行各种操作。
它在程序执行时得到运行,它与机器语言指令一一对应。
伪指令:它只告诉汇编程序(MASM.EXE)应如何汇编,而本身并不形成机器语言指令。
它在源程序汇编的过程中运行。
宏指令:这是用户自己定义的指令,它由指令、伪指令构成,并在汇编过程中进行宏展开。
它也是一种伪指令,没有对应的机器语言指令。
5. 汇编语言程序设计的一般步骤(1)分析问题:从实际问题中提取数学模型,明确任务要求及目的;(2)确定算法:根据问题确定算法,画出程序流程框图;(3)编写程序:根据流程框图和CPU的指令系统,利用汇编语言编写程序;(4)调试程序:通过在计算机上汇编、连接后得到可执行文件,选取一组典型的数据,在DEBUG下调试程序,如有错则返回修改源程序;直至程序运行得到正确的结果;(5)编写说明:对每个程序都应该编写其说明文件,包括程序使用的前提、用法、典型示例等。
6. 分支条件的合理选择条件转移指令的转移范围为-128~+127,因此经常会遇到转移超出范围的错误,这时应与JMP(无条件转移)指令配合使用。
例如:CMP AL,BLJG greatMOV AL,BL……但标号great与指令JG great之间的距离超出条件转移指令的转移范围,这时应找出JG指令的相反指令JNG或JBE,采用下列方法实现:CMP AL,BLJBE middleJMP graetMiddle:MOV AL,BL……4.3 典型例题例4.1 写出下列变量的内容:VAR1 DB 125,125/3, -1, -10HVAR2 DW 125, 125/3, -1, -10HVAR3 DB ‘AB’, ‘CD’VAR4 DW ‘AB’, ‘CD’解:按十六进制数依次写出各个变量的内容为:VAR1:7D,29,FF,F0VAR2:007D,0029,FFFF,FFF0VAR3:41,42,43,44VAR4:4142,4344按内存存储顺序给出:7D,29,FF,F0,7D,00,29,00,FF,FF,F0,FF,41,42,43,44,42,41,44,43 例4.2 设有下列伪指令:START DB 1,2,3,4,’ABCD’DB 3 DUP(?,1)BUF DB 10 DUP (?),15L EQU BUF-START求L的值。
解:由EQU伪指令知,L的值为BUF的偏移地址减去START的偏移地址,而变量START 共占用8个字节,第2行定义的变量(无变量名)共占用6个字节,因此,L的值为8+6=14=0EH。
例4.3 在缓冲区DATABUF中保存有一组无符号数据(8位),其数据个数存放在DATABUF 的第1、2个字节中,要求编写程序将数据按递增顺序排列。
(与教材p.114例4.3.10类似, 但方法不同)解:这里采用双重循环实现数据的排序,这可使程序变得简单。
N=100 ;设有100个数据STACK SEGMENT STACK ‘STACK’DW 100H DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTDATABUF DW NDB N DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXLEA SP,TOP; 取出随机数据MOV CX,DATABUFLEA SI,DATABUF+2MOV BL,23MOV AL,11LP:INC SIADD AL,BLLOOP LP; 数据排序MOV CX,DATABUFDEC CXLEA SI,DATABUF+2ADD SI,CXLP1:PUSH CXPUSH SILP2:MOV AL,[SI]CMP AL,[SI-1]JAE NOXCHGXCHG AL,[SI-1]MOV [SI],ALNOXCHG:DEC SILOOP LP2POP SIPOP CXLOOP LP1;数据排序结束MOV AH,4CH ;返回DOSMOV AL,0INT 21HCODE ENDSEND START例4.4 (97年考研题)有一组数据(16位而进制数)存放在缓冲区BUF1中, 数据个数保存在BUF1的头两个字节中。
要求编写程序实现在缓冲区中查找某一数据,如果缓冲区中没有该数据,则将它插入到缓冲区的最后;如果缓冲区中有多个被查找的数据,则只保留第一个,将其余的删除。
解:在缓冲区BUF中搜索指定的数据,当没有找到时,插入该数据;当找到时,进入搜索多余的重复数据,每找到一个就删除它(将缓冲区的剩余数据向前移动一个字)。
当然应注意更新缓冲区的长度单元。
STACK SEGMENT STACK 'STACK'DW 100H DUP(?)TOP LABEL WORDSTACK ENDS; 设缓冲区原有10个字,指定的数据为(NEW)=56AAHDATA SEGMENTBUF DW 10DW 1000H,0025H,6730H,6758H,7344H,2023H,0025H,6745H,10A7H,0B612HDW 10 DUP(?)NEW DW 56AAHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV ES,AXMOV SS,AXLEA SP,TOP;搜索指定的数据MOV CX,BUFLEA SI,BUF+2MOV AX,NEWL1:CMP AX,[SI]JZ L2.......INC SIINC SILOOP L1;没有找到,则插入数据MOV [SI],AXINC BUFJMP OK;找到后,在剩余部分搜索重复的数据L2:DEC CXINC SIINC SIL3:CMP AX,[SI]JZ L4INC SIINC SILOOP L3JMP OK;找到一个重复数据,则删除它L4:PUSH SIDEC CXPUSH CXMOV DI,SIINC SIINC SICLDREP MOVSWDEC BUFPOP CXPOP SIJMP L3 ;删除后,返回继续搜索重复的数据OK:MOV AH,4CH ;返回DOSMOV AL,0INT 21HCODE ENDSEND START例4.5 (98年考研题)在缓冲区DAT1和DAT2中,存放着两组递增有序的8位二进制无符号数,其中前两个字节保存数组的长度,要求编程实现将它们合并成一组递增有序的数据DAT,DAT的前两个字节仍用于保存数组长度。
解:这里要用到3个指针的使用。
对于写指针首选使用DI,两个读指针可采用SI和BX,分别指示DAT1和DAT2。
这样可适时使用字符串指令,以简化程序设计。
在设计中,将用BX指示的缓冲区DAT2内容读入AL,这样,当要将DAT1的内容传送到DAT时,可采用MOVSB指令;当要将DAT2的内容传送到DAT时,可采用STOSB指令。
STACK SEGMENT STACK 'STACK'DW 100H DUP(?)TOP LABEL WORDSTACK ENDS;设DAT1中有10个数据,DAT2中有13个数据DATA SEGMENTDAT1 DW 10DB 10H,25H,67H,68H,73H,83H,95H,0A8H,0C2H,0E6HDAT2 DW 13DB 05,12H,26H,45H,58H,65H,67H,70H,76H,88H,92H,0CDH,0DEHDAT DW ?DB 200 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXLEA SP,TOPMOV CX,DAT1MOV DX,DAT2MOV DAT,CXADD DAT,DXLEA SI,DAT1+2LEA BX,DAT2+2LEA DI,DAT+2CLDL1:MOV AL,[BX]INC BXL2:CMP AL,[SI]JB L3MOVSB ;DAT1区中的数据传送到DAT区DEC CXJZ L4JMP L2L3:STOSB ;DAT2区中的数据传送到DAT区DEC DXJZ L5JMP L1L4:MOV SI,BXDEC SIMOV CX,DXL5:REP MOVSBMOV AH,4CH ;返回DOSMOV AL,0INT 21HCODE ENDSEND START例4.6 (99年考研题)已知缓冲区BUFA内有20个互不相等的整数(其序号从0到19),缓冲区BUFB内有30个互不相等的整数(其序号从0到29)。