汇编语言概况-汇编语言程序设计_第1页
汇编语言概况-汇编语言程序设计_第2页
汇编语言概况-汇编语言程序设计_第3页
汇编语言概况-汇编语言程序设计_第4页
汇编语言概况-汇编语言程序设计_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.3汇编语言中的标记、表达式和伪指令3.3.1汇编语言概况图3.8由汇编程序执行的汇编过程1汇编语言——用指令助记符来表示机器语言。汇编语言编写的程序——源程序。汇编语言中的指令与机器指令之间具有一一对应的关系。经过汇编后,得到目标代码。汇编语言是面向机器的语言。它的优点——直接面向机器,硬件操作能力强,目标代码小,执行效率高。缺点:与其它高级语言相比较,程序阅读、理解相对困难,可移植性差。下面看一段汇编语言程序例子2DATA SEGMENT ;数据段定义开始

DAI DB ‘INPUTSTRING:$’BUFDMA DB 80H DUP(?)DATA ENDS ;数据段定义结束STACK SEGMENT ;堆栈段定义开始

ME1 DB 80H DUP(?)STACK ENDS ;堆栈段定义结束CODE SEGMENT

;代码段定义开始

ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSETMEI MOV AH,09H INT 21H MOV DX,OFFSETBUFDMA MOV AH,0AH INT 21HCODE ENDS ;代码段定义结束END ;程序结束规范程序33.3.2汇编语言中的标记汇编语言是面向机器的程序设计语言。汇编语言程序设计在计算机的程序设计中占据重要的地位,特别是对于自动化专业更是如此。汇编语言程序的最大优点:直接面对计算机的硬件,可以直接操作计算机的全部资源,具有最高的效率和控制硬件的能力。最主要缺点:面向特定的计算机,不方便程序移植,需要熟悉硬件。41汇编语言指令的书写格式及标识符(1)指令书写格式标号:指令助记符操作数,(操作数)

;注释(2)标号:又叫标识符。为可选项,它在指令助记符前,以“:”结尾。标号是该指令在内存中存放的符号地址,转移指令,过程调用指令通常使用该标号来作为目的地址。一个程序段的开头、一个数据段的开头一般会给出标识符。子程序投、转移程序的转移目的需要给出标识符。5标号由英文字母、数字、或“_,@,?”等组成,但应注意:第一个符号不能是数字;“?”不能单独做标号。保留字不能作为标号使用。所谓保留字,就是所有的指令,伪指令以及汇编语言定义的特殊符号,例如LJMPDB等。

标号不是每一条指令都必须的,只有需要时,指令前面才加标号。所谓需要,就是转移指令的目的地址,或过程(子程序)的第一条指令,或其它目的。标号的长度:不超过31位。6①标号由英文字母、数字、或“_,@,?”等组成,但应注意:第一个符号不能是数字;“?”不能单独做标号。保留字不能作为标号使用。所谓保留字,就是所有的指令,伪指令以及汇编语言定义的特殊符号,例如LJMPDB等。

②标号不是每一条指令都必须的,只有需要时,指令前面才加标号。所谓需要,就是转移指令的目的地址,或过程(子程序)的第一条指令,或其它目的。③标号的长度:不超过31位。7例如:STARTMY_CODEXABCD1?001L004ABC@都是有效的标号8而以下这些标号

4ABC

第一个字符是数字

MAIN$

使用了非法字符$STR=6

使用了非法字符=A/B

使用了非法字符/?

问号不能单独作标号使用

MOV

使用了保留字MOV

都是无效的标号。保留字是指整个字符串,如果字符串中只有部分字符与保留字相同则没关系例如:A_MOV_BAND123等,都是有效标号。9(3)指令助记符和操作数前面学过。10(4)注释是可选项,它主要是为了增加程序的可读与可理解性,注释部分不影响程序的执行。注释部分以“;”号开始,可以使用任何符号。一行写不下,可以使用多行,凡是“;”后面的,都是注释。注释放在一段程序之前,对这段程序进行说明。或者放在指令之后,对这条指令执行的作用进行说明。11

DATASEGMENT ;数据段定义开始

DA1 DB‘Thisisasampleprogram’DB0DH,0AH,’$’DATAEMDS;数据段定义结束

STACKSEGMENT;堆栈段定义开始

ST1DB100DUB(?);定义100个字节

STACKENDS DATASEGMENT ;数据段定义开始

DA1 DB‘Thisisasampleprogram’DB0DH,0AH,’$’DATAEMDS ;数据段定义结束

12STACKSEGMENT ;堆栈段定义开始

ST1DB100DUB(?);定义100个字节堆栈空间

STACKENDSCODESEGMENT ;代码段定义开始MAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACK ORG1000

START:PUSHDS ;程序代码开始

MOVAX,0 ……MAINEMDP ;代码结束

CODEENDS ;代码段定义结束

ENDSTART ;程序结束132保留字汇编语言中用到的,不能给用户随意定义为其它功能的字符和字符串。例如:全部的指令助记符,寄存器名伪指令符号表达式符号等。143.分界符汇编语言程序设计中,作为程序,或一条指令中两个部分的分隔符用。例如两个操作数之间的分隔符,标号的分隔符注释的分隔符教材124页表3.2给出了可用的分界符。154.常数在指令中,它就是立即数。可以使用各种数制,注意不同数制的表示方式。如果是字符串,需要用单引号括起来,例如‘ABCD’它表示包含4个字符的字符转,分别用每个字符的ASCII码存放41H,42H,43H,44H‘1234’表示的是字符串,存放31H,32H,33H,34H163.3.3表达式1.表达式的组成:操作数和运算符。2.操作数:可以代表一个数据,也可以代表一个地址。逻辑运算符关系运算符分析运算符综合运算符173.运算符(1)算术运算符包括+;-;*;/;取模运算MOD取模运算MOD——两数相除,取它的余数。例如:20MOD7结果为?655MOD6=118(2)逻辑运算符包括:与(AND);或(OR),非(NOT),异或(XOR)注:只能对常数进行,结果也是常数他与指令的逻辑运算有区别——该运算符在汇编时进行计算,而指令实在程序执行过程中进行运算。例如ANDDX,PORTAND0FEH逻辑表达式,汇编时计算出结果逻辑指令,程序执行时起作用193关系运算符两个操作数的关系相等EQ,不等NE,小于LT,大于GT,小于或等于LE,大于或等于GE。参与运算的两个操作数必须都是数据,或者是同一段存储单元的地址;结果是数据,关系成立,结果等于0FFFFH, 或0FFFFFFFFH

如果关系不成立,结果等于0例如: MOVBX,PORTLT3如果确实PORT<3,则汇编后,得到的代码相当于指令MOVBX,0FFFFH20反之,如果关系不成立,汇编后的机器代码相当于MOVBX,0关系运算符往往和逻辑运算符组合使用。例如MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)如果是32位寄存器,结果0,或0FFFFFFFFH214.分析运算符将存储单元的地址分解为段码和偏移值。OFFSET——取偏移地址例如MOVDX,OFFSETDATSEG——取存储单元的段码(段基址)例如:MOVAX,SEGABC MOVDS,AXTYPE——SIZE——LENGTH——225.综合运算符主要要求掌握PTR——与BYTE,WORD,DWORD合用,定义存储单元的类型。MOVBYTEPRT[1000],12HMOVWORDPTR[1000H],12H233.3.4语句汇编语言程序有一系列语句有序构成。两种语句指令性语句就是一条指令。例如MOVAX,1234HADDAX,BX指示性语句不产生机器指令代码的语句,又叫伪指令语句。ABCDB50H,35HSEGMENTCODE等24它们的区别:指令性语句对应着一条机器指令,汇编后会产生对应的机器指令代码指示性语句只为汇编过程提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。指示性语句使用标号时,标号后不用冒号分隔符。最本质的区别:是否产生目标代码。253.3.5伪指令最常用的伪指令有:CPU定义.586/.586P·标号赋值EQU;·定义存储单元DB、DW、DD、DQ、DT;·定义存储类型BYTE、WORD、DWORD;·段定义位指令SEGMENT、ENDS、ASSUME和ORG;简约段定义位指令DATA、STACK、CODE·过程定义PROC、ENDP、NEAR、FAR;·程序结束END26默认为8086,如果不是,则需要定义。例如.386.586.586P1.确定CPU的伪指令272.标号赋值伪指令EQU定义标号或符号常数

比如:

ABC EQU220 XYZ EQUABC程序设计中,对一些端口,或常数,一般会定义一个符号常数,然后再源程序设计中使用符号常数。例如COM1EQU3F8HCOM2EQU2F8HLPTEQU378H28DB、DW、DD、DQ、DT

比如:

CR DB 0DH LF DB 0AH BUF_DIS DB ? DO_2 DB 9DUP(?) DONT DW 10DUP(?) TABLE DB 00,01,03,02,06,04,05,07 DB 0FH,0EH,0CH,0DH,09 DB0BH,0AH,08

比如:

COUNT1 DT ?

相当于语句

COUNT1 DB 10DUP(?)3.定义存储单元的伪指令294定义存储单元类型的伪指令BYTE、WORD和DWORD

比如:

MOV BYTEPTR[DI],00 MOV WORDPTR[1000],00 INC BYTEPTR[DI] MOV DWORDPTR[2000],0FFFFFFFFH注意:最高位大于9,补一个0,教材上129页的例,有错误305段定义伪指令(1)SEGMENT、ENDS将汇编语言源程序分为若干段——代码段,堆栈段、数据段(2)ASSUME

定义段寄存器

ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA(3)ORG定义目标代码的偏移地址。

ORG2000HSEGMENTCODE……ENDSORG后面的代码从CS:2000H开始。315简约段定义

简化的段定义伪指令.DATA/.STACK/.CODE .MODELSMALL .586 .DATA M1 DW00FFH M2 DW 00FFH P1 DW ? P2 DW ?.STACK ST DB 100 DUP (?).CODE START: MOV AX,DATA MOV DS,AX32MOV AX,TOPMOV SP,AXMOV BX,OFFSETM1MOV AX,[BX]MOV DX,00MOV BX,OFFSETM2MUL [BX]MOV BX,OFFSETP1MOV [BX],AXMOV BX,OFFSETP2MOV [BX],DX HLTEND START336.过程定义伪指令PROC/ENDPNEARFAR例子:BCD码相加的程序段。

.MODELSMALL .586 .DATA FIRST DB 11,22,33,44 SECOND DB 55,66,77,88 SUM DB 20DUP(?) .STACK STA DB 20DUP(?) .CODESTART: MOV AX,DATA MOV DS,AX34

MOV AX,TOP MOV SP,AX MOV SI,OFFSET FIRST MOV DI,OFFSET SUM MOV BX,OFFSET SECOND MOV CX,04 CLD CLCADITI: CALL AAA LOOP ADITI ……AAA PROC NEAR LOD SB ADC AL,[BX] DAA STOSB INC BX RETAAA ENDPEND START357.源程序结束伪指令END或END 表达式表达式就是程序第一条语句前面的标号。例如前面的程序END START363.4

程序设计的基本步骤分析问题,形成与解决问题对应的数学模型根据数学模型,确定所使用的算法根据算法绘制程序流程图根据流程图编写程序调试程序37

3.4.1流程图的画法1流程图的基本符号①程序的开始与结束符号框②程序的处理过程符号框38③判断符号框判断判断表示程序执行方向的有向线段当一张图画不下时,使用连接符号连接两张图或一张图的两个部分符号39位于不同位置并顺序连接的两个连接符号具有相同的编号。编号可以用数字,也可以用字符串。CE3第二页1D2有这些基本符号,就可以画出程序流程框图。还有一些其它的符号,我们不要求,需要时查相关资料。AB1第一页开始条件?2YN40一个流程图实例41422流程图的画法(1)依据算法,将一个问题分解为一系列的计算、或判断步骤,用图框符号表示每一步的处理、或判断过程;(2)按照算法顺序,用有向线段将这些图框符号表示的处理过程连接起来,箭头表示的是处理过程的执行方向。(3)对于判断框,在它的分支出标出条件:用Y表示判断结果为“是”执行该分支,“N”表示判断结果为非执行;(4)对于转移目标,一般应该给出一个符号,作为编写程序代码是的转移符号地址(标号)。434.4.2程序的基本结构最基本的程序结构:顺序结构、分支结构、循环结构。i=初值A修改并判断iYN循环结构AB顺序结构分支结构判断ABNYABC1ABC2ABC3子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。44

3.4.3简单程序设计简单程序就是不存在转移类指令的程序,程序的执行过程没有转移,严格按照先后顺序,中间没有分支、循环、也不存在子程序的调用。例

:将存储器单元DAT1中保存的一个组合BCD数转换成两个对应ASCII码值,并存入DAT2开始的两个单元,低位在前,高位在后。

45BCD码转换成ASCII码数据:非压缩BCD数据在高半字节+3.例如数字55:0000010100110101000001010011000000110101用逻辑或指令OROR000001010011000000110101用加法指令OR+得到的结果是相同的。都是在高半字节加3。46该问题算法就很简单:从DAT1取出BCD数据,先将高4位清“0”,与30H相加或进行逻辑或,存入DAT2,再取出数据,将数据逻辑右移4位(高位BCD数移到低4位,高4位变“0”,再与30H相加(或进行逻辑或),存入DAT2+1单元。程序流程图:47程序流程图程序代码DATASEGMENT DAT1DB34H DAT2DB?,?DATAENDSCODESEGMENTASSUMECS:CODE,

DS:DATASTARA:MOVAX,DATA MOVDS,AX ;送段地址

LEASI,DAT1LEADI,DAT2 MOVAL,[SI] ANDAL,0FH ADDAL,30H MOV[DI],AL MOVAL,[SI]

开始段定义AL(SI)AL(AL)�FH(DI)(AL)+30HAL(SI)结束AL(AL)右移4位(DI+1)(AL)+30H设置DS,SIDAT1DIDAT2显示:MOVDL,ALMOVAH,02HINT21H48

MOVCL,4SHRAL,CLORLAL,30H MOV[DI+1],AL MOVAH,4CH INT21HCODEENDS ENDSTART如果要送到屏幕显示,则将转换结果先送DL,02送AH,调用DOS功能。类似前面的程序。显示:MOVDL,ALMOVAH,02HINT21HAH=4CH功能调用。功能是结束本程序,返回DOS49再看一个顺序程序:

编写一个计算Z=(x2-3y)/2的程序,x,y为单字节正整数,Z用2字节保存。这是一个算术运算程序,算法设计:首先计算X2=X*X,暂存该结果,其次计算3*y,第三步计算X2-3*y第四步计算(x2-3y)/2。该步使用算术右移实现除2运算,比用除法指令执行速度快。依据该算法,可以画出程序流程框图。50开始计算Z=x*x计算Z=(X*X-3Y)/2结束计算3*yX2的计算,可以分解为3*Y的计算,可以分解为AL

xMULALBXAXCXAXADDAX,CXADDAX,CXALY,AH=051;数据段定义

DATA SEGMENT X DB25 Y DB32 Z DW ? DATAENDS;代码段开始

CODE SEGMENT ASSUMECS:CODE,DS:DATA

EXPREPROCFAR

;过程定义 START:PUSHDS;DS:00保存的是一条返回

SUBAX,AX ;DOS指令。

PUSHAX ;这里,将返回DOS的地址

;压入堆栈MOVAX,DATA52 MOVDS,AX

;数据段首地址(基地址) MOVAL,X

MOVBL,AL

MULBL ;X*X=X2

MOVBX,AX

MOVAL,Y

;Y

MOVAX,0

MOVCX,AX ADDAX,CX ;2Y ADDAX,CX ;3Y

XCHGAX,BX

SUB

AX,BX

;X2-3Y SHR

AX,1

;右移一位/2 MOV

Z,AX RET

EXPREENDP;过程定义结束CODEENDS ENDSTARTRET指令,转到DS:00,对于EXE格式程序,它是一条返回DOS的指令。53;数据段定义

DATA SEGMENT X DB25 Y DB32 Z DW ? DATAENDS;代码段开始

CODE SEGMENT ASSUMECS:CODE,DS:DATAMOVAX,DATA MOVDS,AX MOVAL,X MOV BL,AL可以使用常规返回DOS方法——INT21H的4CH功能调用54

MULBL ;X*X=X2

MOVBX,AX

MOVAL,Y

;Y

MOVAX,0

MOVCX,AX ADDAX,CX ;2Y ADDAX,CX ;3Y

XCHGAX,BX

SUB

AX,BX

;X2-3Y SHR

AX,1

;右移一位/2 MOV

Z,AX MOVAH,4CH INT21H EXPREENDP;过程定义结束

CODEENDS ENDSTART用INT21的4CH号功能调用返回DOS。55顺序程序的结构简单,但实际程序设计中,往往需要对某些条件进行判断,依据不同的条件执行不同的分支,这样,顺序程序将不能满足要求。563.4.4分支程序的设计就是利用CPU的条件转移指令,通过判断某个标志为的状态,控制程序的执行过程。

57二分支结构分支结构判断ABNYABC1ABC2ABC3分支结构判断BNYABC1ABC258多分支结构条件判断Y条件1程序1程序2程序nN程序n+159我们还是通过实例来讨论。例:内存单元M有一个16位的带符号数,求它的绝对值,并将结果放回原处。

算法:求一个数的绝对值时,如果是正数,绝对值不变,如果是负数,则求它的机器负数(连同符号位一起每位取反,最低位+1,就是使用NEG指令)。有了算法,可以画出程序流程图。60转移目的指令给出标号(符号地址)开始设置DSSIMAX[SI]ORLAX,AXSF=1NEGAXYNDONE[SI](AX)结束N_NUMB该标号为了阅读程序方便判断数据的符号,在X86中就是判断SF标志位,数据传送指令不改变标志位,因此用一条逻辑运算指令ORLAx,AX,它不改变AX的值,但设置标志位SF61

DATA2SEGMENT

MDW?

DATA2ENDSCODE2SEGMENT

ASSUMECS:CODE2,DS:DATA2START:MOVAX,DATA2 MOVDS,AX LEASI,M;MOVSI,OFFSETM MOVAX,[SI] ORLAX,AX;ANDAX,AX JNSDONEN_NUMB:NEGAX

DONE:MOV[SI],AX MOVAH,4CH INT21HCODE2ENDSENDSTARA62多分支程序对分支程序,可以有这种2分支程序构成。满足条件1?NYFUN1满足条件2?满足条件3?分支4分支3分支2分支1YYNNFUN2FUN3FUN4FUN5TST2TST1TST363计算函数的程序算法分析:取出数据X,判断它的符号,首先判断是否>=0,如果不是,则是负数,Y=-1,如果是,还须再次判断是否等于0。程序流程框图为:64开始段定义及初始化取数据-->AX(AX)≥0?(AX)=0?Y=-1Y=0Y=1结束YYNNLP1LP3LP2END1画流程图的时候,对转移目标地址(最好是分支程序的两个分支点)都给出一个标号,在写代码时好使用LP065DATA3SEGMENTXDW-8YDB?DATA3ENDSCODE3SEGMENTASSUMECS:CODE3,DS:DATA3START: MOVAX,DATA3;设置段基址

MOVDS,AX LEASI,X ;取偏移地址

MOVAX,[SI] ANDAX,AX66

JNSLP1 ;SF=0,转到LP1LP0:

MOVY,0FFH

;-1的补码

JMPEND1LP1:

JZLP3 ;X=0,转到LP3LP2:

MOVY,01H ;X>0,y=1 LJMPEND1LP3:

MOV Y,00H ;X=0,Y=0END1:

MOVAH,4CH INT21HCODE3ENDS ENDSTART673.4.5循环程序循环程序的基本结构:循环程序由5个基本部分构成:初始化、循环体、循环参数修改、循环控制、结束处理。循环程序有两种基本结构。循环初始化循环体循环控制

Y继续循环结束处理循环参数修改结束循环68循环初始化循环体循环控制

继续循环结束处理循环参数修改结束循环循环程序的另一种结构如图它的特点是先进性循环控制,判断是否满足循环结束条件,如果满足,则结束循环。两种结构的区别在于判断循环结束条件的位置不同。第一种方法,循环体至少被执行一次。第二种可能不被执行。例如求200个数据的绝对值,可以使用循环程序。69开始取地址SIDAT1DIDAT2循环次数CX200AL[SI](AL)<0NEGAL[DI](AL)NEXTYNCHECK修改SI,DI指向下一字节循环次数(CX)-1(CX)<0结束初始化循环控制70DATASEGMENTDAT1DB200DUP?DAT2DB200DUP?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEA SI,DAT1 ;(SI)←源地址指针

LEA DI,DAT2 ;(DI)←目标地址指针

MOV CX,200 ;(CX)←循环次数71CHECK:

MOV AL,[SI] ;取一个带符号数到AL OR AL,AL ;AL内容不变,但使之影响标志 JNS NEXT ;若(SF)=0,则转NEXT NEG AL ;否则求补NEXT:MOV [DI],AL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论