收藏 分销(赏)

汇编语言顺序程序设计.pptx

上传人:w****g 文档编号:4224881 上传时间:2024-08-26 格式:PPTX 页数:105 大小:579.20KB
下载 相关 举报
汇编语言顺序程序设计.pptx_第1页
第1页 / 共105页
汇编语言顺序程序设计.pptx_第2页
第2页 / 共105页
汇编语言顺序程序设计.pptx_第3页
第3页 / 共105页
汇编语言顺序程序设计.pptx_第4页
第4页 / 共105页
汇编语言顺序程序设计.pptx_第5页
第5页 / 共105页
点击查看更多>>
资源描述

1、 第四章第四章汇编语言程序设计汇编语言程序设计设问:设问:1为什么要有伪指令为什么要有伪指令?2运算结果怎样显示在屏幕上运算结果怎样显示在屏幕上?3含有键盘输入的程序如何编写含有键盘输入的程序如何编写?4.4.完完整整的的汇汇编编语语言言程程序序都都有有哪哪些些要要求求?5.5.简化的程序格式是不是更方便?简化的程序格式是不是更方便?本章重点本章重点汇编语言程序格式汇编语言程序格式伪指令的用法伪指令的用法数值运算程序设计数值运算程序设计屏幕显示和键盘输入屏幕显示和键盘输入4.1汇编语言程序设计初步汇编语言程序设计初步举例举例:编写一个汇编语言程序,实现下列公式编写一个汇编语言程序,实现下列公式

2、计算。计算。假设假设X=4,Y=5Z=(XY)8X24.1.1第第1个汇编语言程序个汇编语言程序设计思路一:设计思路一:(1)设设公公式式中中出出现现的的三三个个变变量量X、Y、Z是是8位带符号数;位带符号数;(2)用用算算术术运运算算指指令令实实现现加加减减乘乘除除运运算;算;(3)指令顺序按照运算顺序书写。)指令顺序按照运算顺序书写。程序段:程序段:MOVAL,X;ALXADDAL,Y;ALX+Y加法加法MOVBL,8;BL8IMULBL;AXAL8乘法乘法MOVBL,X;BLXMOVBH,0;BH0SUBAX,BX;AXAXX减法减法MOVBL,2;BL2IDIVBL;AX2除法,商在除

3、法,商在AL,余数在,余数在AH中中MOVZ,AL;Z商商MOVZ1,AH;Z1余数余数设计思路二:设计思路二:(1)公式中出现的三个变量)公式中出现的三个变量X、Y、Z是带是带符号数,在数据段中定义;符号数,在数据段中定义;(2)用算术运算指令实现加减运算;)用算术运算指令实现加减运算;(3)将操作数左移)将操作数左移3位二进制位数代替乘以位二进制位数代替乘以8运算,操作数右移运算,操作数右移1位相当于除以位相当于除以2;(4)指令在代码段中,指令顺序按照运算)指令在代码段中,指令顺序按照运算顺序书写。顺序书写。DATASEGMENT;数据段定义伪指令;数据段定义伪指令XDW4;定义;定义X

4、为字单元,值为为字单元,值为4YDW5ZDW?;定义;定义Z为空单元为空单元DATAENDS;数据段结束;数据段结束完整的程序如下:完整的程序如下:;abc.asm公式计算公式计算CODESEGMENT;代码段定义伪指令;代码段定义伪指令ASSUMECS:CODE,DS:DATA;指定段寄存器与对应段名;指定段寄存器与对应段名START:MOVAX,DATAMOVDS,AX;将数据段段地址送入;将数据段段地址送入DSMOVBX,XMOVAX,YADDAX,BX;加法;加法MOVCL,3SALAX,CL;算术左移;算术左移3次,相当于乘以次,相当于乘以8SUBAX,X;减法;减法SARAX,1;

5、算术右移;算术右移1次,相当于除以次,相当于除以2MOVZ,AXMOVAH,4CH;此两句为结束程序,返回;此两句为结束程序,返回DOSINT21HCODEENDS;代码段结束;代码段结束ENDSTART;整个程序结束伪指令;整个程序结束伪指令4.1.2从源程序到可执行程序从源程序到可执行程序图图汇编语言程序从输入到生成可执行文件过程汇编语言程序从输入到生成可执行文件过程1建立和生成的文件建立和生成的文件2汇编环境汇编环境3上机步骤上机步骤4调试程序调试程序1建立和生成的文件建立和生成的文件(1)用用户户编编写写的的源源程程序序,源源程程序序名名自自定、扩展名为定、扩展名为.ASM(2)源源程

6、程序序经经汇汇编编程程序序MASM汇汇编编(翻翻译译)后后生生成成二二进进制制目目标标程程序序,文文件件名名默默认认与与源源程程序序同同名名、扩扩展展名名为为.OBJ(3)目目标标程程序序需需要要经经过过LINK连连接接生生成成可可执执行行程程序序,文文件件名名默默认认与与源源程程序序同名、扩展名为同名、扩展名为.EXE2汇编环境汇编环境最基本的汇编环境只需要两个文件:最基本的汇编环境只需要两个文件:MASM.EXE和和LINK.EXE。将这两。将这两个文件拷入到已经建好的文件夹(例个文件拷入到已经建好的文件夹(例如如HB)中,并将文件夹)中,并将文件夹HB放在硬盘放在硬盘根目录根目录C:下下

7、文本编辑软件可以用文本编辑软件可以用EDIT或者或者“记记事本事本”3上机步骤上机步骤Ccd退到根目录退到根目录Ccdhb进入进入hb子目录子目录C:hbeditabc.asm编辑源程序编辑源程序C:hbmasmabc.asm汇编汇编C:hblinkabc.obj连接连接C:hbabc.exe执行执行C:hbdebugabc.exe调试调试进入进入DOS窗口中执行:窗口中执行:4调试程序调试程序-U反汇编反汇编-G断点断点执行程序执行程序-DDS:0查看数据段查看数据段-Q退出退出进入进入DEBUG后,执行如下命令:后,执行如下命令:上机练习:上机练习:(1)验证举例的设计思路二程序)验证举例

8、的设计思路二程序(2)将举例的设计思路一的程序段增)将举例的设计思路一的程序段增加相关的伪指令,修改为可上机执行加相关的伪指令,修改为可上机执行的程序。的程序。4.2伪指令伪指令4.2.1段定义伪操作段定义伪操作n段定义伪指令段定义伪指令nASSUME伪指令伪指令段定义伪指令段定义伪指令 段定义伪指令可用来定义各种类型的段。段定义伪指令可用来定义各种类型的段。格式如下:格式如下:段名段名SEGMENT类型参数类型参数段名段名ENDSSEGMENT和和ENDS必须成对使用,表示段的必须成对使用,表示段的开始和结束。开始和结束。类型参数:类型参数:(1)定位类型)定位类型PARA该段的起始地址必须

9、为小段的首地址,即段该段的起始地址必须为小段的首地址,即段地址的十六进制数最低位为地址的十六进制数最低位为0BYTE该段可以从任意地址开始该段可以从任意地址开始WORD该段必须从字边界开始,即段的起始地址为该段必须从字边界开始,即段的起始地址为偶数偶数DWORD该段必须从双字边界开始,即段地址的十六该段必须从双字边界开始,即段地址的十六进制数最低位应为进制数最低位应为4的倍数的倍数PAGE该段必须从页边界开始,即段地址的十六进制该段必须从页边界开始,即段地址的十六进制数最低两位为数最低两位为00(能被(能被256整除)整除)如果不指出定位类型,系统默认为如果不指出定位类型,系统默认为PARA。

10、(2)组合类型)组合类型PRIVATE该段为私有段,连接时不与其他同名段合并该段为私有段,连接时不与其他同名段合并PUBLIC连接时可与其他模块中的同名段按顺序连接连接时可与其他模块中的同名段按顺序连接成一个段成一个段COMMON表示该段与其他模块中的同名段有相同的起表示该段与其他模块中的同名段有相同的起始地址,如果连接将产生覆盖;连接后,始地址,如果连接将产生覆盖;连接后,段的长度为同名段中的最长者段的长度为同名段中的最长者STACK表示该段为堆栈段表示该段为堆栈段AT表达式表达式该段直接定位在表达式指出的位置上该段直接定位在表达式指出的位置上如果不指定组合类型,系统默认为如果不指定组合类型

11、,系统默认为PRIVATE。(3)类别标识)类别标识在引号中给出段的类型名,在连接时,类别标识相同的在引号中给出段的类型名,在连接时,类别标识相同的段放在连续的存储区中。段放在连续的存储区中。例如,用例如,用STACK来标识该段为堆栈段来标识该段为堆栈段返回返回ASSUME伪指令伪指令ASSUME伪指令用于指明段寄存器与段伪指令用于指明段寄存器与段的对应关系,格式为:的对应关系,格式为:ASSUME段寄存器:段名,段寄存器:段名,段寄存器:段寄存器:段名,段名,如果不使用如果不使用ASSUME伪指令,系统就无法获伪指令,系统就无法获知用户定义的段都有哪些,进而就不能正确知用户定义的段都有哪些,

12、进而就不能正确地划分段。地划分段。返回返回数据定义伪指令格式为:数据定义伪指令格式为:存储单元名存储单元名DB(或(或DW、DD等伪指令)等伪指令)操作数操作数其中:其中:(1)存储单元可以起名也可以不要名字)存储单元可以起名也可以不要名字(2)数据定义伪指令)数据定义伪指令DB 定义字节单元定义字节单元DW 定义字单元定义字单元DD定义双字单元定义双字单元DQ定义四字单元定义四字单元DT定义十字节单元定义十字节单元(3)操作数用于指出存储单元的内容即该单元的值。)操作数用于指出存储单元的内容即该单元的值。一条数据定义伪指令可以给多个存储单元赋值。一条数据定义伪指令可以给多个存储单元赋值。需要

13、说明的是确定存储单元的内容时要与存储单需要说明的是确定存储单元的内容时要与存储单元的属性一致。元的属性一致。4.2.2数据定义伪指令数据定义伪指令操作数是常数或表达式操作数是常数或表达式 例例1定义字节单元定义字节单元X=56,字单元,字单元E_1=2030H,双字,双字单元单元CARRY=12345678HDATASEGMENTXDB56E_1DW2030HCARRYDD12345678HDATAENDS实际存储显示:实际存储显示:例例2一一次次定定义义多多个个存存储储单单元元。字字母母打打头头的的十十六进制数要在前面加六进制数要在前面加0,?代表空单元,?代表空单元XXDB12,0,0E4

14、HYYDW5,?,?,6*3实际存储显示:实际存储显示:例例3用用DUP()子句重复定义相同操作数子句重复定义相同操作数AVEDB8,3DUP(2),-6MSNDB5DUP(?)COUNTDW100DUP(1)存储示意:存储示意:操作数是字符串操作数是字符串例例1定义字符及字符串,字符串要用引号括起来定义字符及字符串,字符串要用引号括起来MES1DBA,BMES2DWABMES3DBHELLO实际存储显示实际存储显示:4.2.3其它伪指令其它伪指令1赋值伪指令赋值伪指令在程序中多次出现同一个表达式时,可以用在程序中多次出现同一个表达式时,可以用EQU定义一个符号来代表表达式,以简化书写。定义一

15、个符号来代表表达式,以简化书写。与与EQU伪操作相似,等号伪操作相似,等号=伪操作也可以给表伪操作也可以给表达式赋值,且允许对一个符号多次重复定义;达式赋值,且允许对一个符号多次重复定义;而而EQU则不允许。则不允许。例:例:CONTEQU125*3.14STREQURIGHTSUMEQU0BUFF=56PASS=2034HBUFF=56H2模块定义伪指令模块定义伪指令 在汇编语言中,可以将程序设为多个模块,每在汇编语言中,可以将程序设为多个模块,每个模块完成独立的功能。因此,每个模块可用模个模块完成独立的功能。因此,每个模块可用模块定义伪指令定义名称和结束标识。格式为:块定义伪指令定义名称和

16、结束标识。格式为:NAME模块名模块名END起始标号起始标号其中,其中,NAME伪指令可以缺省。如果缺省,则伪指令可以缺省。如果缺省,则以该模块的源程序名作为模块名。以该模块的源程序名作为模块名。END伪指令不能缺省。其后的起始标号可伪指令不能缺省。其后的起始标号可以是程序的第一条汇编指令的标号以是程序的第一条汇编指令的标号START,或者是主过程名。或者是主过程名。3地址计数器地址计数器 地址计数器地址计数器$表示当前的偏移地址值。表示当前的偏移地址值。如果用在数据段的存储单元定义中,可写成:如果用在数据段的存储单元定义中,可写成:ABCDW1,2,$+3,4实际存储显示:实际存储显示:如果

17、用在转移指令中:如果用在转移指令中:JMP$+5则无条件跳转到当前指令的偏移地址则无条件跳转到当前指令的偏移地址+5单元继单元继续执行。续执行。4设置偏移地址伪指令设置偏移地址伪指令当前的偏移地址可以用当前的偏移地址可以用ORG伪指令定义。伪指令定义。如果用在数据段中,该指令可以确定存储单元的偏移如果用在数据段中,该指令可以确定存储单元的偏移地址,例如将地址,例如将X单元的偏移地址定义为单元的偏移地址定义为0020H,该单,该单元的内容为元的内容为5,即,即(DS:0020H)=5。伪指令如下:。伪指令如下:DATASEGMENTORG0020HXDW5DATAENDS如果用在代码段中,可从指

18、定的单元开始存放并执行如果用在代码段中,可从指定的单元开始存放并执行指令。指令。例如从代码段的例如从代码段的100H开始执行:开始执行:ORG100HSTART:MOVAX,X;标号;标号START设置为设置为100HMOVBX,YADDAX,BX5操作符操作符在汇编指令中可以使用一些操作符,汇编程序编译时将在汇编指令中可以使用一些操作符,汇编程序编译时将这些操作符变为相应的数值回送或者定义属性。这些操作符变为相应的数值回送或者定义属性。(1)回送偏移地址值)回送偏移地址值OFFSETMOVBX,OFFSETX;将;将X单元的偏移地址传送给单元的偏移地址传送给BXMOVAX,OFFSETSTA

19、RT;将标号;将标号START的偏移地址传送给的偏移地址传送给AX(2)回送段地址值)回送段地址值SEGMOVBX,SEGX;将;将X单元的段地址传送给单元的段地址传送给BXMOVAX,SEGSTART;将标号;将标号START的段地址传送给的段地址传送给AX(3)类型回送操作符)类型回送操作符TYPEMOVBX,TYPEX;如果;如果X是字节单元,则回送值为是字节单元,则回送值为1,即,即BX1;若是字单元,值为若是字单元,值为2,双字单元,值为,双字单元,值为4(4)属性操作符)属性操作符PTRMOVBYTEPTRBX,10;定义目的操作数为字节单元;定义目的操作数为字节单元MOVWORD

20、PTRSI,20;定义目的操作数为字单元;定义目的操作数为字单元(5)类型操作符)类型操作符LABELXLABELBYTE;X单元的类型定义为单元的类型定义为BYTE字节型,也可以定字节型,也可以定义为义为WORD字型、字型、DWORD双字型等双字型等6.注释伪指令注释伪指令分号分号“;”后面的内容为注释。后面的内容为注释。编编写写程程序序时时最最好好加加入入注注释释,便便于于以以后后的阅读和修改。的阅读和修改。练习:练习:写出伪指令,并回答问题。写出伪指令,并回答问题。(1)定定义义名名为为NEW的的字字单单元元,保保存存10,20,30,40四个数四个数(2)将将NEW单单元元的的段段地地

21、址址放放入入DX寄寄存存器,偏移地址放入器,偏移地址放入BX寄存器寄存器(3)NEW中中数数值值40所所在在单单元元的的偏偏移移地地址是多少?址是多少?(4)如果将)如果将NEW单元的偏移地址设置单元的偏移地址设置为为10H,用什么伪指令?,用什么伪指令?4.3基本汇编指令基本汇编指令1MOV传送指令传送指令MOV传送指令是双操作数指令,传送指令是双操作数指令,SRC为源操作数、为源操作数、DST为目的操作数。要为目的操作数。要求两个操作数的属性必须一致。求两个操作数的属性必须一致。格式:格式:MOVDST,SRC目的操作数,源操作数目的操作数,源操作数4.3.1数据、栈及查表数据、栈及查表2

22、.数据交换指令数据交换指令XCHGXCHG指令是双操作数指令,指令的功能是将两个操指令是双操作数指令,指令的功能是将两个操作数的内容互换。要求必须有一个操作数是寄存器,作数的内容互换。要求必须有一个操作数是寄存器,而且两个操作数的属性必须一致。操作数不能为立即而且两个操作数的属性必须一致。操作数不能为立即数。数。格式:格式:XCHGOPR1,OPR2例例1XCHGAX,BX;寄存器;寄存器AX和和BX的内容互换的内容互换XCHGBX,AL;AL寄存器的内容和字节型寄存器的内容和字节型存储单元的内容互换存储单元的内容互换XCHGCX,XSI;CX寄存器的内容和字型存寄存器的内容和字型存储单元的内

23、容互换储单元的内容互换3进栈和出栈指令进栈和出栈指令(1)PUSH进栈指令进栈指令格式:格式:PUSHSRC执行操作:(执行操作:(SP)(SP)-2(SP)+1,(SP)(SRC)先将堆栈指针先将堆栈指针SP减减2,再将操作数,再将操作数SRC入栈。要求入栈。要求SRC必须是字。必须是字。PUSHAX(2)POP出栈指令出栈指令格式:格式:POPDST执行操作:执行操作:(DST)(SP)+1,(SP)(SP)(SP)+2将堆栈指针所指字单元的内容弹到操作数将堆栈指针所指字单元的内容弹到操作数DST中,再中,再将将SP加加2。POPAX例例1已已知知(AX)=95E3H,(BX)=1986H

24、,(SP)=0010H,(SS)=1250H,将将 AX、BX压栈保存。画出入栈过程。压栈保存。画出入栈过程。执行指令:执行指令:PUSHAXPUSHBX入栈过程示意:入栈过程示意:例例2上上例例中中,接接着着执执行行若若干干指指令令后后,再执行出栈操作。再执行出栈操作。执行指令:执行指令:MOVAX,0MOVBX,1POPBXPOPAX出栈过程示意:出栈过程示意:如如果果在在写写出出栈栈指指令令时时,换换成成别别的的寄寄存存器器,那那么么就就相相当当于于用用堆堆栈栈中中的的数数据据给给其他寄存器赋值。例如:其他寄存器赋值。例如:PUSHAXPUSHBXPOPCXPOPDX执行后执行后(CX)

25、=1986H,(DX)=95E3H。设计思路:设计思路:(1)用伪指令定义存储单元用伪指令定义存储单元x中的三个数中的三个数(2)y存储单元预留出三个空单元存储单元预留出三个空单元(3)用用PUSH和和POP指令实现数的倒序存放指令实现数的倒序存放(4)PUSH和和POP的的操操作作数数均均采采用用直直接接寻寻址址方式方式程序如下:程序如下:示例示例4-1设计程序。利用堆栈,将存设计程序。利用堆栈,将存储单元中的三个数倒序存放。储单元中的三个数倒序存放。;程序;程序4-1.asm3个数的倒序存放个数的倒序存放datasegmentxdw12,34,56ydw3dup(?)dataendscod

26、esegmentassumecs:code,ds:datastart:movax,datamovds,axpushxpushx+2pushx+4popypopy+2popy+4movah,4chint21hcodeendsendstart4.查表转换指令查表转换指令XLAT(1)格式:)格式:XLAT执行的操作:在执行的操作:在BX为表首地址的内存表为表首地址的内存表中查找相对地址为中查找相对地址为AL的单元,取出其中的单元,取出其中的内容放入的内容放入AL中。中。(2)要求:数据表的首地址放入)要求:数据表的首地址放入BX,要查找的单元的偏移地址由要查找的单元的偏移地址由AL指出。指出。(3

27、)功能:把)功能:把AL中的数据换成对应的中的数据换成对应的存储单元中的内容。存储单元中的内容。设计思路:设计思路:(1)一位十六进制数:一位十六进制数:0-9,A-F(2)ASCII码:码:30H,39H,41H,42H,46H(3)算算法法确确定定:建建立立数数据据表表TABLE,并并以以十十六进制数六进制数HEX作为索引号(位移量)作为索引号(位移量)(4)采用)采用DOS中断调用实现显示功能中断调用实现显示功能TABLE表在内存的存储情况:表在内存的存储情况:示例示例4-2编程序。用查表指令将一位十六进编程序。用查表指令将一位十六进制数转换为它相应的制数转换为它相应的ASCII码并显示

28、出该数。码并显示出该数。;program4-2.asmdatasegmenttabledb30h,31h,32h,33h,34h,35h,36h,37hdb38h,39,41h,42h,43h,44h,45h,46hhexdb6;要查找;要查找6asciidb?dataendscodesegmentassumecs:code,ds:databegin:movax,datamovds,axmovbx,offsettable;bxtable表的偏移地址表的偏移地址moval,hex;al6xlat;换码指令;换码指令movascii,al;保存查到的;保存查到的ASCII码码movdl,al;要显

29、示的字符放入;要显示的字符放入DLmovah,02h;DOS中断调用的中断调用的2号功能号功能int21h;INT中断调用指令中断调用指令movah,4chint21hcodeendsendbegin4.3.2逻辑地址的获得逻辑地址的获得1.LEA有效地址传送指令有效地址传送指令格式:格式:LEA寄存器,存储单元寄存器,存储单元功能:将存储单元的有效地址传送给寄功能:将存储单元的有效地址传送给寄存器。其作用与前面讲的存器。其作用与前面讲的OFFSET操作操作符的作用一样。符的作用一样。例:例:LEABX,TABLELEADX,BXLEABX,COUNTSI2LDS数据段地址传送指令数据段地址传

30、送指令 格式:格式:LDS寄存器,双字存储单元寄存器,双字存储单元功能:将双字单元中保存的低字送入寄存器,功能:将双字单元中保存的低字送入寄存器,高字传送给高字传送给DS数据段寄存器。数据段寄存器。例:已知例:已知(DS)=1300H,(BX)=0032H,(13032H)=3504H,(13034H)=2936H,执行指令:执行指令:LDSSI,BX源操作数的有效地址为源操作数的有效地址为0032H其物理地址其物理地址=1300H10H+0032H=13032H指令执行后:指令执行后:(SI)=3504H,(DS)=2936H3LES附加段地址传送指令附加段地址传送指令格式:格式:LES寄存

31、器,双字存储单元寄存器,双字存储单元功能:将双字单元中保存的低字送入寄存功能:将双字单元中保存的低字送入寄存器,高字传送给器,高字传送给ES数据段寄存器。数据段寄存器。例:已知例:已知(DS)=1400H,(BX)=0046H,(14046H)=2307H,(14048H)=5640H,执,执行指令:行指令:LESDI,BX源操作数的有效地址为源操作数的有效地址为0046H其物理地址其物理地址=(DS)10H+EA=1400H10H+0046H=14046H指令执行后:指令执行后:(DI)=2307H,(ES)=5640H4.3.3符号位扩展符号位扩展1CBW字节扩展为字指令字节扩展为字指令格

32、式:格式:CBW功能:将功能:将AL扩展到扩展到AX。如果。如果AL的符号位为的符号位为0,则则AH为为0,如果,如果AL的符号位为的符号位为1,则,则(AH)=FFH2CWD字扩展为双字指令字扩展为双字指令格式:格式:CWD功能:将功能:将AX扩展到扩展到DX。如果。如果AX的符号位为的符号位为0,则则DX为为0,如果,如果AX的符号位为的符号位为1,(DX)=FFFFH4.3.4双精度数运算双精度数运算无论是单精度数运算还是双精度数运无论是单精度数运算还是双精度数运算,都要用到算术运算类指令。算,都要用到算术运算类指令。算术运算类指令包括加法指令、减法算术运算类指令包括加法指令、减法指令、

33、乘法指令、除法指令四种类型。指令、乘法指令、除法指令四种类型。这些指令有双操作数指令也有单操作这些指令有双操作数指令也有单操作数指令,运行的结果会影响标志位。数指令,运行的结果会影响标志位。1ADD加法指令加法指令格式:格式:ADDDST,SRC功能:源操作数和目的操作数相加,结果再放入功能:源操作数和目的操作数相加,结果再放入目的操作数目的操作数DST。2.ADC带进位加法指令带进位加法指令格式:格式:ADCDST,SRC功能:源操作数加上目的操作数再加上进位标志功能:源操作数加上目的操作数再加上进位标志CF,结果放入目的操作数,结果放入目的操作数DST。ADC带进位加法指令一般用在双精度加

34、法操作带进位加法指令一般用在双精度加法操作中。中。例例:ADDAX,5 ADDAL,30HADDBH,CLADDAX,SIADDBYTEPTRBX,23INC加加1指令指令格式:格式:INCOPR功能:将操作数功能:将操作数OPR加加1设计思路:设计思路:(1 1)两两个个双双精精度度数数存存放放在在数数据据段段中中。相相加后的结果也放在数据段中。加后的结果也放在数据段中。(2 2)程程序序中中用用dx、ax存存放放第第一一个个双双精精度度数数20034910h,用用cx、bx存存放放第第二二个个双双精度数精度数1008e699h。程序如下:程序如下:示例示例4-4编程序实现两个双精度数编程序

35、实现两个双精度数20034980H和和1008E699H加法运算。加法运算。;program4-4.asm两个双精度数加法两个双精度数加法codesegmentassumecs:code,ds:datastart:movax,datamovds,axmovax,ds:0;第一个双精度数的低字;第一个双精度数的低字movdx,ds:2;第一个双精度数的高字;第一个双精度数的高字movbx,ds:4;第二个双精度数的低字;第二个双精度数的低字movcx,ds:6;第二个双精度数的高字;第二个双精度数的高字addax,bx;低字相加;低字相加adcdx,cx;高字带进位加;高字带进位加movds:8

36、,axmovds:10,dxmovah,4chint21hcodeendsendstartdatasegmentdd20034980hdd1008e699hdd?dataends4.3.5多字节数运算多字节数运算1SUB减法指令减法指令格式:格式:SUBDST,SRC功能:目的操作数减源操作数,结果再功能:目的操作数减源操作数,结果再放入目的操作数放入目的操作数DST。2SBB带借位减法指令带借位减法指令格式:格式:SBBDST,SRC功能:目的操作数减去源操作数后再减功能:目的操作数减去源操作数后再减去进位标志去进位标志CF,结果放入目的操作数,结果放入目的操作数DST。SBB带借位减法指令

37、一般用在双精度减带借位减法指令一般用在双精度减法操作中。法操作中。3DEC减减1指令指令格式:格式:DECOPR功能:将操作数功能:将操作数OPR减减14NEG求补指令求补指令格式:格式:NEGOPR功能:将操作数求反加功能:将操作数求反加1。即求补操作,。即求补操作,对正数的补码求补变为其负数的补码,对正数的补码求补变为其负数的补码,对负数的补码求补变为其正数的补码。对负数的补码求补变为其正数的补码。利用利用NEG指令可以求负数的绝对值。指令可以求负数的绝对值。5CMP比较指令比较指令格式:格式:CMPOPR1,OPR2功能:将两个操作数作相减运算,结果功能:将两个操作数作相减运算,结果不回

38、送,改变标志位。通常后跟条件转不回送,改变标志位。通常后跟条件转移指令,根据移指令,根据CMP比较之后标志位的值比较之后标志位的值进行转移。进行转移。4.3.6乘除运算乘除运算 1MUL无符号数乘法指令无符号数乘法指令乘法指令是单操作数指令。字节乘法的乘法指令是单操作数指令。字节乘法的8位被位被乘数隐含在乘数隐含在AL中,字乘法的中,字乘法的16位被乘数隐位被乘数隐含在含在AX;乘数写在指令中。;乘数写在指令中。(1)字节乘法)字节乘法格式:格式:MULSRC功能:功能:(AX)(AL)(SRC)执行的操作:将执行的操作:将AL与字节型源操作数与字节型源操作数SRC相相乘,乘积放入乘,乘积放入

39、AX寄存器。即两个寄存器。即两个8位数相乘,位数相乘,乘积为乘积为16位数。位数。(2)字乘法)字乘法格式:格式:MULSRC功能:功能:(DX、AX)(AX)(SRC)执行的操作:将执行的操作:将AX与字型源操作数与字型源操作数SRC相乘,乘积放入相乘,乘积放入DX、AX寄存器,即乘寄存器,即乘积为双精度数。积为双精度数。2IMUL带符号数乘法指令带符号数乘法指令与无符号数乘法指令格式一样,但是指令的操与无符号数乘法指令格式一样,但是指令的操作码改为作码改为IMUL。执行带符号数乘法指令时,。执行带符号数乘法指令时,系统将把操作数作为补码进行运算。系统将把操作数作为补码进行运算。(1)字节乘

40、法)字节乘法格式:格式:IMULSRC(2)字乘法)字乘法格式:格式:IMULSRC例例1设设(AL)=35H,(BL)=89H。用用无无符符号号乘乘法法指指令令做做乘乘法法操操作作,用用DEBUG观观察察运运行行结结果果。35H=53,89H=137,乘积是乘积是1C5DH=7261。MOVAL,35HMOVBL,89HMULBL例例2设设(AL)=35H,(BL)=89H。用用带带符符号号乘乘法法指指令令做做乘乘法法操操作作,观观察察运运行行结结果果。补补码码35H=53,89H=-119,乘乘积积是是E75DH=-6307。MOVAL,35HMOVBL,89HIMULBL4.3.7混合算

41、术运算混合算术运算 1DIV无符号数除法指令无符号数除法指令除法指令也是单操作数指令。字节除法的除法指令也是单操作数指令。字节除法的16位位被除数隐含在被除数隐含在AX中,中,8位除数在指令中;字位除数在指令中;字除法的除法的32位被除数隐含在位被除数隐含在DX、AX,16位除位除数写在指令中。数写在指令中。(1)字节除法)字节除法格式:格式:DIVSRC功能:功能:(AL)(AX)(SRC)的商的商(AH)(AX)(SRC)的余数的余数执行的操作:执行的操作:16位被除数位被除数AX与与8位源操作数位源操作数SRC相除,相除,8位的商放入位的商放入AL寄存器,寄存器,8位余位余数在数在AH寄

42、存器中。寄存器中。(2)字除法)字除法格式:格式:DIVSRC功能:功能:(AX)(DX、AX)(SRC)的商的商(DX)(DX、AX)(SRC)的余数的余数执行的操作:执行的操作:32位被除数位被除数DX、AX与与16位源操位源操作数作数SRC相除,相除,16位的商放入位的商放入AX寄存器,寄存器,16位余数在位余数在DX寄存器中。寄存器中。2IDIV带符号数除法指令带符号数除法指令指令的操作码为指令的操作码为IDIV。指令格式与无符。指令格式与无符号数除法一样。号数除法一样。执行带符号数除法指令时,系统把操作执行带符号数除法指令时,系统把操作数作为带符号数补码进行运算,商和数作为带符号数补

43、码进行运算,商和余数也都是带符号数。余数也都是带符号数。(1)字节除法)字节除法格式:格式:IDIVSRC(2)字除法)字除法格式:格式:IDIVSRC示示例例4-6编编程程序序,实实现现混混合合算算术术运运算算。算算术术表达式如下:表达式如下:W=(X3Y45)Z其其中中,X、Y、Z均均为为16位位带带符符号号数数。要要求求运运算算结果的商保存在结果的商保存在W、余数保存在、余数保存在W+2单元中。单元中。设计思路:设计思路:(1)在在数数据据段段中中定定义义4个个字字型型变变量量X、Y、Z、W。(2)采采用用带带符符号号数数乘乘除除指指令令,要要注注意意操操作作数数的的属性问题。属性问题。

44、(3)假定)假定X、Y、Z的值如程序所示,则结果应的值如程序所示,则结果应为:商在为:商在W单元单元=FFFCH=4,余数在,余数在W+2单单元元=FFFCH。程序如下:程序如下:datasegmentxdw48ydw-21zdw14wdw?,?dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovax,3imulymovbx,axmovcx,dxmovax,xcwdaddax,bxadcdx,cxsubax,45sbbdx,0idivzmovw,axmovw+2,dxmovah,4chint21hcodeends

45、endstartW=(X3Y45)Z4.3.8十进制数运算十进制数运算1、压缩的、压缩的BCD码加法调整码加法调整格式:格式:DAA功能:如果功能:如果AL的低的低4位大于位大于9,则将,则将AL加加6,并将辅助进位标志,并将辅助进位标志AF置置1。如。如果果AL的高的高4位大于位大于9,将,将AL加加60H,并将进位标志并将进位标志CF置置1。例例十十进进制制计计算算57=12,用用BCD码码表表示示做做计计算。算。XDB05HYDB07HMOVAL,XADDAL,Y;相加后,;相加后,(AL)=00001100=0CHDAA;加加6调调整整后后,(AL)=00010010=12H(压压缩缩

46、的的BCD码)码)2压缩的压缩的BCD码减法调整码减法调整格式:格式:DAS功能:如果功能:如果AL的低的低4位大于位大于9,则将,则将AL减减6,并将,并将AF置置1。如果。如果AL的高的高4位大位大于于9,将,将AL减减60H,并将,并将CF置置1。例例十进制计算十进制计算6238=24W1DB62H;BCD码表示的十进制码表示的十进制62W2DB38HMOVAL,W1SUBAL,W2;相减后,;相减后,(AL)=2AHDAS;减;减6调整后,调整后,(AL)=24H3.非压缩非压缩BCD码加法调整码加法调整格式:格式:AAA功能:如果功能:如果AL的低的低4位大于位大于9,将,将AL加加

47、6、AH加加1,AL的高的高4位清零、位清零、CF、AF置置1。由于非压缩的由于非压缩的BCD码用码用1个字节表示个字节表示1个个十进制数,所以调整后若加上十进制数,所以调整后若加上30H就是就是该数值的该数值的ASCII码。码。例例十进制计算十进制计算6+8=14,用非压缩的,用非压缩的BCD码表示并显示在屏幕上。码表示并显示在屏幕上。T1DB06HT2DB08HMOVAL,T1;(AL)=00000110=06HADDAL,T2;(AL)=00001110=0EHAAA;调整后;调整后(AH)=01H,(AL)=04HADDAX,3030H;AH、AL分别加上分别加上30H,变成,变成AS

48、CII码码MOVBX,AX;用;用BX保存保存MOVDL,BH;显示;显示“1”MOVAH,2;2号显示功能号显示功能INT21H;DOS中断调用中断调用MOVDL,BL;显示;显示“4”INT21H4非压缩的非压缩的BCD码减法调整码减法调整格式:格式:AAS功能:如果功能:如果AL的低的低4位大于位大于9,将,将AL减减6、AH减减1,AL的高的高4位清零、位清零、CF、AF置置1。例例十十进进制制计计算算5718=39,用用非非压压缩缩的的BCD码表示。码表示。MOVAX,0507HMOVBX,0108HSUBAL,BLSUBAH,BH;高位不用带借位减;高位不用带借位减AAS;减法调整

49、后;减法调整后 (AX)=0309H5非压缩的非压缩的BCD码乘法调整码乘法调整格式:格式:AAM(ASCIIAdjustMultiply)功能:将乘积功能:将乘积AX中的中的2个非压缩的个非压缩的BCD码调整。码调整。AL除以除以0AH,得到的商送,得到的商送AH,余数送入,余数送入AL。即乘积的高位数在。即乘积的高位数在AH、低位数在、低位数在AL中。中。例例十进制乘法十进制乘法68=48,用非压缩的,用非压缩的BCD码表示,并显示。码表示,并显示。P1DB06HP2DB08HMOVAL,P1;(AL)=00000110=06HIMULP2;(AL)=00110000=30HAAM;调整后

50、;调整后(AH)=04H,(AL)=08HADDAX,3030H;AH、AL分别加上分别加上30HMOVBX,AX;用;用BX保存保存MOVDL,BH;显示;显示“4”MOVAH,2INT21HMOVDL,BL;显示;显示“8”INT21H6非压缩的非压缩的BCD码除法调整码除法调整格式:格式:AAD(ASCIIAdjustDivision)功能:在做除法之前,将被除数功能:在做除法之前,将被除数AX中的中的2个非压缩的个非压缩的BCD码调整。码调整。(AL)=(AL)+(AH)*10,AH清零。除法清零。除法之后,商在之后,商在AL、余数在、余数在AH中。中。4.4屏幕显示和键盘输入屏幕显示

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服