第6章 汇编语言程序设计_第1页
第6章 汇编语言程序设计_第2页
第6章 汇编语言程序设计_第3页
第6章 汇编语言程序设计_第4页
第6章 汇编语言程序设计_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

第六章汇编语言程序设计,6.1汇编语言程序概述6.2汇编语言程序的上机过程6.3系统功能调用,STACK_SEGSEGMENTSTACK;定义堆栈段STACK_SEGDW100HDUP(?);分配堆栈段大小为512字节STACK_SEGENDS;堆栈段结束DATA_SEGSEGMENT;定义数据段DATA_SEGXDB10;定义数据YDB5ZDB1ANSDB?DATA_SEGENDS;数据段结束CODE_SEGSEGMENT;定义代码段CODE_SEGASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEG;设定段寄存器与段之间的对应关系,例6.1汇编语言程序,START:MOVAX,DATA_SEG;装入数据段的段地址DSMOVDS,AXMOVAL,X;程序代码ADDAL,YSUBAL,ZMOVANS,ALMOVAX,4C00H;返回DOSINT21HCODE_SEGENDS;代码段结束ENDSTART;汇编结束;程序起始点为START,例6.1汇编语言程序(续),6.1.1汇编语言的语句格式,1.执行性语句执行性语句是由可执行指令构成的语句,通常对应一条机器指令,以机器码的形式保存在程序的代码段中。执行性语句的完整格式为:标号:指令助记符操作数,操作数;注释注:一条执行性语句可分为4个字段,其中方括号中的字段为可选项。例如:START:MOVAX,DATA_SEG;装入数据段的段地址,标号:用户定义的标识符,它反映了指令的位置(逻辑地址)和类型。标号后跟一个冒号分隔,通常表示转移指令或循环指令的目标地址。标号为可选项。指令助记符:指令系统中的指令。操作数:根据指令的不同,操作数的个数可有02个,操作数之间以逗号分隔。注释:由分号“;”开始的部分均为注释内容,注释为可选项,通常用以增加源程序的可读性。汇编过程中不对注释做任何处理。,标识符和保留字,标识符(Identifier)由字母(AZ)、数字(09)及规定的特殊符号(?、-、$)组成。数字不能作为第一个字符,而圆点仅能用作第一个字符。标号最长为31个字符。默认情况下,汇编程序不区别标识符中的字母大小写。一个源程序中,每个标识符的定义是唯一的,并且不能使用汇编语言的保留字。保留字(ReservedWord)是汇编程序已经使用的标识符(也称为关键字),主要有:硬指令助记符例如:MOV、ADD伪指令助记符例如:DB、DW操作符例如:OFFSET、PTR寄存器名例如:AX、CS,2.说明性语句说明性语句是由伪指令构成的语句,它通常指示汇编程序如何汇编源程序。说明性语句的完整格式为:名字伪指令助记符参数,参数,。;注释名字:用户定义的标识符。通常用于定义变量名、过程名或者段名。名字和伪指令助记符之间用空格或制表符分隔。伪指令助记符:伪指令不产生CPU动作,是在程序执行前由汇编程序处理的说明性指令。参数:伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。,源程序可采用两种格式书写:1、完整段定义格式。2、简化段定义格式。MASM5.0开始支持简化段定义格式。,6.1.2汇编语言的程序格式,6.1.3伪指令,变量定义伪指令常量定义伪指令表达式操作符段定义伪指令过程定义伪指令其它伪指令,1.变量定义伪指令,功能:指定变量的类型和名称,并为变量分配存储单元。存储单元初始化。变量定义语句的格式:变量名DB/DW/DD参数,参数,参数DB/DW/DD:分别定义1个字节、字(2个字节)、双字(4个字节)。DF/DQ/DT:定义3字,4字,5字。变量名:用户自定义的标识符,存放数据存储单元的符号地址。变量名为可选项。,表6.1变量定义格式,注:格式中表示可缺省项;/表示或。,参数类型,(1)数值表达式为存储单元赋初值,变量名为该存储单元的名称【例6.5】ORG100H;从偏移地址100H处开始安排数据VAR1DB01H,-1VAR2DW1234H,78H注意:操作数顺序高低字节位置,参数类型(续1),(2)?表达式预留存储单元,其内容不初始化。形式:变量名DB/DW/DD?功能:汇编程序仍然分配存储单元,但不预置确定的值。常用来存放程序的中间和最终结果。例:TEMPDB?;分配一个字节单元RESULTDW?,?;分配两个字单元,(3)带DUP的表达式,“参数”为重复项形式:变量名DB/DW/DDnDUPDUP:重复数据定义操作符n:重复次数:重复内容注意:DUP操作符可嵌套使用例:X1DB5DUP(0)TAB1DB10HDUP(?);预留10H个字节单元TAB2DB2DUP(2DUP(3),参数类型(续2),(4)字符串,“参数”为ASCII码功能:可用DB命令定义字符串,为串中的每个字符分配一个字节存储单元。说明:字符串用引号(单或双)括起,256个字符;在内存中,字符以ASCII码表示;存放顺序:自左向右按地址递增顺序存放。注意:当运用DW定义字符串时,字符的个数不能超过2个,内存单元中高地址存放引号中的第一个字符的ASCII码,低地址存放后一个字符的ASCII码。若引号中只有一个字符,则内存单元高地址存放00H。【例6.8】ORG1000HDATA1DBADATA2DB123456DWC;等价于DW0043H,参数类型(续3),(5)参数为标号或变量功能:存放标号或变量的偏移地址或逻辑地址。当使用DW只定义偏移地址当使用DD同时定义偏移地址与段基址例:X1DWCYCLE;偏址=X1X2DDCYCLE;段址、偏址=X2(高)(低)CYCLE:MOVAX,3,参数类型(续4),例:SUMDB1,2,3MOVAL,SUMMOVAX,SUM,注意:变量的使用要保证类型匹配。,例题,2.常量定义伪指令,常数是没有任何属性的纯数值。常数分为两种类型:数值型常数和字符串型常数。数值型常数二进制数:以字母B结尾,如01011101B八进制数:以字母Q或O结尾,如723Q,211Q。十进制数:以字母D(或省略)结尾,如1995D,3508。十六进制数:以字母H结尾,如3A40H,8BH。字符型常数用单引号括起来的字符串。如ABCD,$123456等。每个字符在机内以ASCII码存放,例如A,在内存为41H。,常量定义伪指令也称为符号定义语句伪指令,包括“等价EQU”和“等号”。等值EQU语句格式:符号EQU表达式功能:将表达式的值赋给EQU左边的符号。表达式可以是常数、变量、标号、数值或地址表达式。等号=语句格式:符号=表达式等号语句(=)与EQU语句有同样的功能,区别在于等号语句定义的符号允许重新定义,使用更加方便灵活。,例:PORT1EQU312PORT2EQUPORT1+1注意:EQU语句不能重复定义。XEQU7XEQUX+5错误使用EQU伪指令时,表达式必须有确定的赋值。例:LPNEQULP112H;LP1应该在此句前加以定义。只作为符号定义用,不产生任何目标代码,不占用存储单元。,常量和变量定义区别EQU:定义立即数,不分配内存单元。DB:定义内存操作数,分配内存单元。例:X1DB3;假设X1在数据段的偏移地址为10HY1EQU5X2DB7,8MOVAL,X1;直接寻址,AL=03HMOVBL,Y1;立即数寻址,BL=05H,3.表达式运算符MASM允许使用的表达式分为两类:数字表达式数字表达式的结果是一个数字。地址表达式地址表达式的结果是一个存储单元的地址。当这个地址中存放的是数据时,称为变量;当这个地址中存放的是指令时,则称为标号。,3.表达式运算符算术运算符逻辑运算符关系运算符分析运算符合成运算符其它运算符,(1)算术运算符,【例6.11】KEQU5+3;等价于KEQU8S1DB1,3,5,7,9MOVAL,S1+3;地址表达式,AL=7注意:当用于数值表达式,结果仍然是数值。符号地址可用于加、减运算。“标号或变量常量”表示同一段中给定位移量的另一存储单元的地址。不同段的两个偏移地址的加、减没有物理意义。,(2)逻辑运算符,(3)关系运算符,【例6.12】逻辑运算符KEQU0F0HAND0FH;等价于KEQU00HMOVAL,NOTK;AL=0FFH,【例6.13】关系运算符MOVAX,5EQ6;AX=0000HMOVBX,5LT6;BX=0FFFFH,(4)数值返回运算符(分析运算符),变量和标号的属性,变量和标号有三种属性:段属性(SEG)。偏移地址属性(OFFSET)。类型属性(TYPE)。变量的类型有:字节、字、双字、3字、4字、5字。标号的类型有:近(NEAR默认)、远(FAR)。,表6.2属性与返回数值的关系,数值返回运算符后只跟一个操作对象,这个操作对象只能是变量或标号。返回结果以数值的形式表示。【例6.14】已知DS=1000H,定义了两个变量VAR1、VAR2。写出下列指令的运行结果。MOVDI,OFFSETVAR1;取偏移地址,DI=0100HMOVAX,SEGVAR1;取段地址,AX=1000HMOVBL,TYPEVAR2;VAR2的类型属性为字,BL=2,SEG:取段址。例:MOVAX,SEGOPEROFFSET:取偏移地址。例:MOVBX,OFFSETOPER=LEABX,OPERTYPE:取类型值。例:若AB是DB定义的变量,执行MOVAX,TYPEAB;AX=0001HLENGTH:取数据个数。仅对DUP定义有效,否则为1。SIZE:取字节数。SIZE=(LENGTH)*(TYPE),例:BUF1DB100DUP(0);LENGTHBUF1=100,SIZEBUF1=100BUF2DW200DUP(0);LENGTHBUF2=200,SIZEBUF2=200*2=400【例6.15】S1DB5DUP(0)S2DW100DUP(?)S3DB1,2,3,4,5MOVAL,SIZES1;AL=15=5MOVBL,SIZES2;BL=2100=200MOVCL,SIZES3;CL=11=1,(5)属性运算符(合成运算符),PTR操作符修改变量/标号类型。格式:类型PTR;变量/标号类型:BYTE,WORD,DWORD,NEAR,FAR功能:使PTR右边的操作数具有PTR左边的类型。【例6.16】VAR1DB1,2VAR2EQUWORDPTRVAR1MOVAL,VAR1;AL=01HMOVAX,WORDPTRVAR1;AX=0201HMOVAX,VAR2;AX=0201H当传送指令的操作数位数不一致时,可以用PTR运算符改变变量属性,使两个操作数一致。,操作符PTR的应用:1)指定内存操作数的类型例:INCBX;非法!合法:INCBYTEPTRBXINCWORDPTRBX2)用EQU和PTR定义一个新变量BUF1DW1234H,5678HBUF2EQUBYTEPTRBUF13)确定指令是段内转移还是段间转移JMPNEARPTRJMPFARPTR,LABEL操作符为当前即将定义的存储单元定义一个指定类型的标号或变量。1)与变量连用:新的变量名、新的变量属性。例:B_VAR1LABELBYTEW_VAR1DW3456H2)与标号连用:新的标号、新的范围。例:DISTFARLABLEFARDISTNEAR:MOVAX,BX,THIS操作符格式:THISEQUTHIS连用,是将其后的属性赋给当前的变量或标号。等价于LABLE。【例6.17】VAR1EQUTHISBYTE;VAR1为字节属性VAR2DW5678H;VAR2为字属性,HIGH/LOW高低分离运算符功能:取数值的高半部分或低半部分【例6.19】MOVAH,HIGH1234H;AH=12HMOVAL,LOW1234H;AL=34H,(6)其它运算符,MOVAX,BX,TABT1,采用圆括号()操作符可以改变运算级优先级,提高程序的可读性。,4.段定义伪指令汇编语言源程序的结构特点:分段结构程序由若干逻辑段组成,各逻辑段都有一个段名,由段定义语句(伪指令语句)定义和说明。包括:代码段CS:必不可少。数据段DS:建立工作区,存放常量、变量、中间结果等。堆栈段SS:建立堆栈区,用于中断、过程调用、参数传递。附加段ES:建立工作区。通常,数据段放在代码段前面。,语句行:语句是汇编语言程序的基本组成单位。每个逻辑段由若干行汇编语句组成,每行一个语句,小于128个字符。一般只占一行,越行时用续行符号定义堆栈段STACK_SEGDW100HDUP(?);分配堆栈段的大小512字节STACK_SEGENDS;堆栈段结束,(2)段分配语句(ASSUME)段分配语句用来完成段的分配,说明当前哪些逻辑段被分别定义为代码段、数据段、堆栈段和附加段。格式:ASSUME段寄存器:段名,段寄存器:段名功能:说明源程序中定义的段由哪个段寄存器去寻址。段寄存器可以是CS,SS,DS,ES。,段寄存器的装入ASSUME语句只建立当段和段寄存器之间的联系,但ASSUME语句不能将各段的段基值装入各个段寄存器,段基址的装入是用程序实现。DS和ES的装入:DS和ES不能用立即数寻址方式直接装入,段基值需先送入通用寄存器,再传送给段寄存器。例:MOVAX,DATAMOVDS,AXSS及SP的装入:在段定义伪指令中,选用“STACK”参数项,在ASSUME语句中,把堆栈段分配给SS,则SS和SP自动装入。如未使用“STACK”参数项,则用程序实现SS和SP的装入。CS及IP的装入:由起始标号确定CS和IP,自动装入。,(3)汇编结束伪指令END格式:END标号作用:表示汇编到此结束。END语句指示汇编程序到此结束汇编过程。可选的标号用于指定程序开始执行点,连接程序将据此设置CS:IP值。注意:汇编结束和程序终止是两码事,5.过程定义伪指令在程序设计中,常把具有一定功能的程序段设计成一个子程序,又称为过程。过程的定义由一对过程伪指令PROC和ENDP来完成。格式:子程序名PROCNEAR/FARRET子程序名ENDPNEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用;FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用。默认采用NEAR属性。,过程的调用与返回,CALLPROC1MOVAX,BX,RET,主程序,子程序,PROC1:,子程序的位置,Codesegmentassumeds:data,cs:code,ss:stackStart:Codeendsendstart,主程序返回DOS,子程序,子程序安排在主程序执行终止后的位置。,;zcx.asmstack_segsegmentparastackstackdb100dup(?)stack_segendscode_segsegmentassumecs:code_seg,ss:stack_segstart:moval,?;主程序提供显示字符calldpchar;调用子程序movax,4c00hint21h;返回DOS,例,dpcharproc;过程定义,过程名为dpcharpushax;顺序入栈,保护寄存器pushbxmovbx,0movah,0eh;显示器0EH号输出一个字符功能int10hpopbx;逆序出栈,恢复寄存器popaxret;子程序返回dpcharendp;过程结束code_segendsendstart;汇编结束,例(续),6.其它伪指令(1)定位伪指令ORG:格式:ORG表达式对于数据段,ORG后面的数据定义从ORG指定的位置分配单元。对于代码段,ORG后面的一条指令语句从指定位置生成目标代码。(2)当前位置计数器$:符号“$”表示当前偏移地址值。【例6.22】ORG0100HDW1,2,$+4,$+4VAR1DB12,23,34LENEQU$-VAR1104H=0108H、106H=10AH、LEN=3。,练习:ORG0010HVARDW1,2,$+2,5,6则汇编后0014H单元的内容是:A)6HB)14HC)5HD)16H,6.2汇编语言程序的上机过程,源程序文件要以ASM为扩展名。源程序文件的编辑可以通过任何一个文本编辑器实现:DOS环境中的EDIT、Windows环境中的记事本Notepad、其他程序开发工具中的编辑环境。EDIT6_1.asm,开发过程1:源程序的编辑,开发过程2:源程序的汇编,汇编是将源程序翻译成由机器代码组成的目标模块文件的过程。MASM5.x提供的汇编程序是MASM.EXE:MASM6_1.asm如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(6_1.obj);否则MASM将给出相应的错误信息。这时应根据错误信息,重新编辑修改源程序后,再进行汇编。,开发过程3:目标模块的链接,连接程序能把一个或多个目标文件和库文件合成一个可执行程序(.EXE、.COM文件):LINK6_1.obj如果没有严重错误,LINK将生成一个可执行文件(6_1.exe);否则将提示相应的错误信息。这时需要根据错误信息重新修改源程序文件后再汇编、链接,直到生成可执行文件。,开发过程4:可执行程序的调试,经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行:6_1如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误。采用DEBUG.EXE调试程序:DEBUG6_1.exe,6.2.3汇编语言上机实例,【例6.23】【例6.28】演示教学,6.3系统功能调用,6.3.1概述6.3.2DOS系统功能调用INT21H6.3.3ROM-BIOS功能调用,6.3.1概述,DOS系统和BIOS以中断服务程序方式提供了大量实用程序供程序员使用。系统功能调用按如下四步进行:1、在AH寄存器中设置子功能号;2、在指定的寄存器中设置入口参数;3、用相应的中断指令执行功能调用;4、根据出口参数分析功能调用的执行情况。,6.3.2DOS系统功能调用INT21H,一个字符的输出一个字符串的输出一个字符的输入一个字符串的输入,一个字符的输出子功能号:AH=02H。入口参数:DL=输出字符的ASCII码。执行该功能后会在显示器当前光标处显示指定的字符,且光标右移一个字符位置。【例6.29】用02H号DOS系统功能调用在显示器输出一个字符。MOVAH,02H;设置子功能号,AH=02HMOVDL,K;设置入口参数,DL=KINT21H;DOS功能

温馨提示

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

评论

0/150

提交评论