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

下载本文档

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

文档简介

4.1汇编语言程序格式4.1

汇编语言的程序格式4.2

伪指令4.3

汇编语言程序上机过程4.4

程序设计基本方法4.1汇编语言的程序格式4.1.1汇编语言程序的结构4.1.2汇编语言语句类型及格式4.1.3汇编语言的数据与表达式返回1.源程序的一般格式STACKSEGMENT┇STACKENDSDATASEGMENT┇DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:…┇CODEENDSENDSTART例4-1编写一个两字相加的程序。DSEGSEGMENT;定义数据段DATA1DW1234H;定义被加数DATA2DW5678H;定义加数DSEGENDS;数据段结束ESEGSEGMENT;定义附加段SUMDW2DUP(?);定义存放结果区ESEGENDS;附加段结束CSEGSEGMENT;定义代码段;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址

ASSUMECS:CSEG,DS:DSEG,ES:ESEGSTART:MOVAX,DSEG;START为程序开始执行的启动标号

MOVDS,AX;初始化DSMOVAX,ESEGMOVES,AX;初始化ESLEASI,SUM;存放结果的偏移地址送SIMOVAX,DATA1;取被加数

ADDAX,DATA2;两数相加

MOVES:[SI],AX;和送附加段的SUM单元中

HLTCSEGENDS;代码段结束

ENDSTART;源程序结束2.源程序的结构特点(1)汇编语言程序通常由若干段组成,段由伪指令SEGMENT与ENDS定义,各段顺序任意,段的数目按需要确定,原则上不受限制。(2)段由若干语句组成,语句以指令为主体而构成。一条语句写在一行上,书写时语句的各部分应尽量对齐(3)汇编语言程序中至少要有一个启动标号,作为程序开始执行时目标代码的入口地址。启动标号常用START、BEGIN、MAIN等命名。(4)为增加程序的可读性,可在汇编语言语句“;”后加上注释。返回4.1.2汇编语言语句类型及格式1.汇编语言语句的类型(1)指令语句是可执行语句,在汇编中要产生对应的目标代码,CPU根据这些代码才能执行相应的操作。(2)伪指令语句是不可执行语句,在汇编中不产生目标代码,用于指示汇编程序如何汇编源程序,利用它定义和说明常量和变量的属性及存储器单元的分配等。(3)宏指令语句是以一个宏名定义的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入。2.语句的格式

[标号:]<指令助记符>[操作数][;注释]

[符号名]<伪指令助记符>[操作数][;注释]返回4.1.3汇编语言的数据与表达式1.常量数值常量、字符串常量、符号常量2.变量例4-2用数据定义伪指令DB、DW、DD定义变量DATASEGMENTDA1DB12H;定义一个字节数据DA2DD0FEDCBA90H;定义一个双字数据DA3DW5678H;定义一个字数据DATAENDS3.标号4.表达式和运算符算术运算符、逻辑运算符、关系运算符、数值返回运算符、(5)修改属性运算符例题例4-3逻辑运算符的应用MOVAL,NOT10101010B;(AL)←01010101BMOVAL,11110000BAND10111101B;(AL)←10110000BMOVAL,10100000BOR00000101B;(AL)←10100101B例4-4关系运算符的应用MOVAX,5EQ101B;(AX)←0FFFFHMOVBH,10HGT16;(BH)←0例4-5数值返回运算符的应用K1DB30H,31H,32HK2DW4041H,4043HK3DW20HDUP(0)K4DD50515253HMOVAL,TYPEK1;等效于MOVAL,1MOVAH,TYPEK2;等效于MOVAH,2MOVAL,LENGTHK3;(AL)←20H,返回DUP前面的数值MOVCL,LENGTHK4;(CL)←01HMOVBL,SIZEK3;(BL)←40HMOVDL,SIZEK4;(DL)←04H例题例4-6段属性运算符的应用MOVAX,ES:[BX];用附加段ES取代默认的数据段DSMOVBL,DS:[BP];用数据段DS取代默认的堆栈段SS例4-7PTR运算符的应用N1DB3,6,9MOVAX,WORDPTRN1;临时指定N1为字类型,(AX)←0603H例4-8THIS运算符的应用ABCEQUTHISBYTE;从本语句开始变量ABC的类型属性指定为字节,不管它原来的类型是什么例4-9HIGH和LOW运算符的应用NUMEQU2456HMOVAL,HIGHNUM;等效于MOVAL,34HMOVBL,LOWNUM;等效于MOVBL,56H返回4.2伪指令4.2.1符号定义伪指令4.2.2数据定义伪指令4.2.3段定义伪指令4.2.4段寻址伪指令4.2.5过程定义伪指令4.2.6模块定义与连接伪指令4.2.7宏命令伪指令4.2.8其它伪指令4.2.1符号定义伪指令1.等值语句例4-10等值语句CREQU0DH;常量TENEQU0AH;常量AAEQUASCII_TABLE;变量VAREQUTEN*2;数值表达式ADREQUES:[BP+DI+5];地址表达式GOTOEQUJMP;指令助记符2.等号语句例4-11等号语句NUM=488;定义NUM等于488NUM=NUM+1;定义NUM等于489返回4.2.2数据定义伪指令例4-12DATADB11H,33H;定义包含两个元素的字节变量DATANUMDW100*5+88;定义一个字类型变量NUM,其初值为表达式的值SUMDQ0011223344556677;将4个字存入变量SUM。例4-13STR1DB‘COMPUTER’;定义一个字符串,字符串的首地址为STR1STR2DW‘AA’,‘BC’,‘DE’;给两个字符组成的字符串分配两个字节存储单元DATADW?,?,?;为DATA预留6个存储单元例4-14DATA1DB20DUP(?);为变量DATA1分配20个字节的空间,初值为任意值

DATA2DW?;为变量DATA2分配2个字节的空间,初值为任意值

DATA3DB20DUP(30H);为变量DATA3分配20个字节的空间,初值均为30H返回4.2.3段定义伪指令格式:段名SEGMENT定位类型组合类型类别名┇段名ENDS1.段名一个段开始和结尾的段名必须一致,否则会出现语法错误2.定位类型(1)BYTE(2)WORD(3)PARA(4)PAGE3.组合类型(1)NONE(2)PUBLIC(3)COMMON(4)STACK(5)MEMORY(6)AT表达式4.类别名返回4.2.4段寻址伪指令格式:ASSUME段寄存器名:段名,段寄存器名:段名,……例4-15求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。DATASEGMENTNUMDB95H,83H,36H,2DHDB33H,22H,1AH,34HDB62H,45H,75H,49HSUMDW?DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENT

ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK

BEGIN:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AX

LEASI,NUM

MOVCX,12

XORAX,AX

NEXT:ADDAL[SI]

ADCAH,0

INCSI

LOOPNEXT

MOVSUM,AXHLTCODEENDSENDBEGIN返回4.2.5过程定义伪指令格式:过程名PROC[NEAR/FAR]┇[RET] ┇RET

过程名ENDP例4-16编写一个延时50ms的子程序DELAYPROC;定义一个近过程

PUSHBX;保护BX原来的内容

PUSHCX;保护CX原来的内容

MOVBL,5;外循环次数NEXT:MOVCX,2801

;内循环次数(实现延时10ms)W10MS:LOOPW10MS;(CX)≠0则循环

DECBL;修改外循环计数值

JNZNEXT;(BX)≠0则进行外循环POPCX;恢复CX原来的内容POPBX;恢复BX原来的内容

RET;过程返回DELAYENDP;过程结束返回4.2.6模块定义与连接伪指令1.模块定义伪指令格式:NAME标识符┇END启动标号2.模块连接伪指令(1)全局符号伪指令格式:PUBLIC符号名1,符号名2,…(2)引用伪指令格式:EXTRN符号名1:类型,符号名2:类型,…例题例4-17编程利用乘法模块计算X*Y。NAMEMAINCALL;主模块

EXTRNWMUL:FARSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSDATASEGMENTPARA‘DATA’XDW3355HYDW8866HDATAENDSCODESEGMENTPARA‘CODE’MAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAX,XMOVBX,YCALLWMUL;调用外部过程WMULRETMAINENDPCODEENDSENDMAIN;主模块结束NAMESUBMUL;子模块CDESGSEGMENTPARA‘CODE’WMULPROCFAR;定义远过程WMULASSUMECS:CDESGPUBLICWMUL;定义WMUL为全局过程名

CALLMULAB;嵌套调用

RET;过程返回WMULENDP;过程结束MULABPROC;定义一个近过程MULABMULBXRETMULABENDP;过程结束CDESGENDS;代码段结束

END;子模块结束返回4.2.7宏命令伪指令1.宏定义例4-18用宏指令定义两个字节数相加,结果存入RESULT单元的操作。ADDMMACROOPR1,OPR2,RESULTMOVAL,OPR1ADDAL,OPR2MOVRESULT,ALENDM2.宏调用例4-19将例4-18中的宏定义进行宏调用、宏展开操作如下:┇ADDM88,36,SUM┇ADDMBR,TAB,SUM3.宏展开:┇+MOVAL,88+ADDAL,36+MOVSUM,AL┇ +MOVAL,BR+ADDAL,TAB+MOVSUM,AL┇4.宏的取消PURGE

返回4.2.8其它伪指令1.定位伪指令例4-20伪指令ORG和当前位置计数器值符号$的应用DATASEGMENTORG30HDB1DB12H,34HORG$+20HSTRINGDB‘STRING’┇DATAENDS2.方式选择伪指令·8086;汇编程序只接受8086/8088的指令,这是默认方式·286;汇编程序接受8086/8088及286的指令·286P;除与·286功能相同之外,汇编程序还接受286保护方式下的指令·386,·386P,·486,·486P含义类推,·586;汇编程序接受8086/8088、286、386、486及586的指令·586P;除与·586功能相同之外,汇编程序还接受586保护方式下的指令3.简化的段定义伪指令·DOSSEG

;标记简化段,各段顺序由系统安排,用于主模块前面·MODELSMALL;指明内存使用模式,指示数据与代码允许使用的长度·DATA

;定义数据段,隐含段名为@DATA·STACK[长度]

;定义堆栈段,隐含段名为@STACK,并形成SS及SP初值·CODE[名字]

;定义代码段,隐含段名为@CODE·END

;汇编结束返回4.3汇编语言程序上机过程4.3.1建立汇编语言的工作环境4.3.2上机操作过程4.3.3DEBUG的使用方法返回4.3.1建立汇编语言的工作环境编辑程序,文件名汇编程序,文件名MASM.EXE连接程序,文件名LINK.EXE调试程序,文件名DEBUG.EXELIB.EXE,库管理程序CREF.EXE,符号索引文件处理程序EXE2BIN.EXE,将EXE转换为COM的文件格式转换程序返回4.3.2上机操作过程1.编辑1.对编辑完成的源程序在存盘时扩展名必须加写.ASM2.一定要严格遵守汇编语言书写格式及段结构的格式来编写程序2.汇编汇编过程就是将汇编语言源程序转换成机器能够识别的目标代码程序,即OBJ的二进制文件。还可生成扩展名为.LST的列表文件,扩展名为.CRF的符号索引文件。3.连接所谓连接是用连接程序LINK.EXE把若干个经汇编后产生的.OBJ文件及指定的库文件连接起来,产生可执行的.EXE文件。4.调试返回4.3.3DEBUG的使用方法1.DEBUG的运行2.DEBUG的主要命令D,显示内存单元内容;U,反汇编命令;R,显示与修改寄存器内容;E,修改内存单元内容;A,汇编命令;T、P,单步执行指令;G,连续执行指令;N,指定装入文件名或写入文件名;L,装入N指定的文件;W,将指定内容写入N指定的文件;Q,退出DEBUG程序,返回操作系统状态。返回4.4程序设计基本方法4.4.1程序设计概述4.4.2顺序结构程序设计4.4.3分支结构程序设计4.4.4循环结构程序设计4.4.5子程序设计4.4.6程序设计举例返回

4.4.1程序设计概述1.程序设计的步骤(1)分析问题(2)建立数学模型(3)确定算法。(4)绘制流程图(5)分配内存空间(6)编制程序与静态检查。(7)上机调试(8)试运行和分析结果(9)整理资料投入运行2.返回DOS的方法MOVAH,4CH;功能号送AHINT21H;返回DOS3.程序的基本结构顺序结构,分支结构,循环结构返回4.4.2顺序结构程序设计例4-21编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。DATASEGMENTWDW268XDW–73YDW48ZDW–85DATAENDSSTACKSEGMENTDW100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,X;计算X*YIMULYMOVCX,AX;用CX存储结果低位

MOVBX,DX;用BX存储结果高位MOVAX,Z;计算X*Y+Z

CWDADDCX,AXADCBX,DXSUBCX,100SBBBX,0MOVAX,WCWDSUBAX,CXSBBDX,BXIDIVWMOVAH,4CHINT21HCODEENDSENDSTART例题例4-22把非压缩十进制数DAT1转换为压缩十进制数。

DOSSEG·MODELSMALL·STACK64H·DATADAT1DW0908H;非压缩十进制数0908H·CODE BEGIN:MOVAX,@DATAMOVDS,AX MOVAX,DAT1;AX←0908HMOVCL,4;CL←4SALAH,CL;09字节左移4位,AH=90HROLAX,CL;9008H字循环左移4位,AX=0089HROLAL,CL;89字节循环左移4位,AL=98HMOVBYTEPTRDAT1,AL

;DAT1←98H,压缩十进制数98HMOVAH,4CH;返回DOSINT21HENDBEGIN返回4.4.3分支结构程序设计图4-1两路分支结构图T程序段1条件F程序段2图4-2多路分支结构图程序段1多路条件程序段2程序段n…1.两路分支程序设计例4-23用比较指令和条件转移指令实现两路分支的程序段。…MOVAX,M;假定M和N为有符号数MOVBX,NCMPAX,BX

;比较M和N的大小,影响标志位,准备条件JGNEXT

;M>N时转移,注意若M、N为无符号数时用JA指令……;分支程序2JMPDONENEXT:……;分支程序1……DONE:RET例题例4-24已知X是单字节带符号数,请设计计算下列表达式的程序。Y= 程序如下:DATASEGMENTXDB?YDB?DATAENDSCODESEGMENT;代码段START:PROCFARASSUMECS:CODE,DS:DATAPUSHDS;保存返回地址

MOVAX,0

X+20(X≥0)|X|(X<0)PUSHAXMOVAX,DATA;初始化DSMOVDS,AXMOVAL,X;取数XCMPAL,0;准备条件

JNSPLUS;X≥0则转移

NEGAL;X<0则求补

JMPDONEPLUS:ADDAL,20;X≥0时,X+20DONE:MOVY,AL;计算结果送YRET;返回STARTENDPCODEENDSENDSTART;汇编结束2.多路分支程序设计SUB1-LSUB1-HSUB2-LSUB2-HSUB3-LSUB3-H图4-3地址跳转表表首地址JMPSUB1JMPSUB2图4-4指令跳转表表首地址例题例4-25假设某企业有10类人员,对每类人员的工资各有不同的处理方法和计算程序。对于一类人员应执行程序段CLASS1,二类人员应执行程序段CLASS2,…,十类人员应执行程序段CLASS10。TableClass1低位字节Class1高位字节Class10高位字节Class2高位字节Class10低位字节Class2低位字节Table+2Table+18(a)地址跳转表…CLASS10CLASS2CLASS1得到相应的分支程序段求表地址取分类号建立地址跳转表设置程序初始条件开始结束(b)程序DATASEGMENTTABLEDWCLASS1,CLASS2,CLASS3,CLASS4,CLASS5DWCLASS6,CLASS7,CLASS8,CLASS9,CLASS10NUMDB?DATAENDSSTACKSEGMENTSTACK

DW100DUP(?)STACKENDSCODESEGMENTMAINPROCFAR

ASSUMECS:CODE,DS:DATA,SS:STACKSTART:PUSHDS

SUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVAL,NUMMOVAH,0SHLAXSUBAX,2LEABX,TABLEADDBX,AXJMP[BX]CLASS1:

……CLASS2:……CLASS10:……RETMAINENDPCODEENDSENDSTART返回循环初始化循环体N循环控制部分Y图4-6先执行后判断循环结构循环体图4-7先判断后执行循环结构循环初始化NY循环控制部分4.4.4循环结构程序设计例题例4-26把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。

DSEGSEGMENTBUFDW80DUP(?)

DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEADI,MEM

MOVBL,79

LOOP1:MOVSI,DI

MOVCL,BLLOOP2:MOVAX,[SI]ADDSI,2CMPAX,[SI]

JNCNEXT

MOVDX,[SI]MOV[SI-2],DXMOV[SI],AXNEXT:DECCL

JNZLOOP2DECBL

JNZLOOP1MOVAH,4CHINT21HCSEGENDSENDSTART返回4.4.5子程序设计例4-27通过寄存器传递参数,将数据块BUF1中的内容传递到数据块BUF2中DATASEGMENTBUF1DB11,22,33,……,99CUNTEQU$-BUF1BUF2DBCUNTDUP(?)

DATAENDSSTACKSEGMENTTOSDW128HDUP(?)

STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACK

MOVSS,AXMOVSP,OFFSET

┇LEASI,BUF1

LEADI,BUF2

MOVCX,CUNT

CALLSUB1

┇SUB1PROCDON:MOVAL,[SI]MOV[DI],ALINCSIINCDILOOPDON

RETSUB1ENDPMOVAH,4CHINT21HCODEENDSENDSTART例题例4-28当I/O状态端口0378H的Bit1(D1位)为0时,表示外设忙;为1则表示外设可以接收数据。试编程根据外设的状态将当前数据段中从BUFFER开始的连续100个字节的内容从I/O数据端口03F8输出到外设SDATAPROCFAR

PUSHAX

PUSHDXPUSHSIPUSHCXLEASI,BUFFERMOVCL,100AGAIN:MOVDX,378H

WAIT:INAL,

温馨提示

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

评论

0/150

提交评论