【教学课件】第3章汇编语言程序设计.ppt

上传人:小飞机 文档编号:5658604 上传时间:2023-08-06 格式:PPT 页数:185 大小:1.38MB
返回 下载 相关 举报
【教学课件】第3章汇编语言程序设计.ppt_第1页
第1页 / 共185页
【教学课件】第3章汇编语言程序设计.ppt_第2页
第2页 / 共185页
【教学课件】第3章汇编语言程序设计.ppt_第3页
第3页 / 共185页
【教学课件】第3章汇编语言程序设计.ppt_第4页
第4页 / 共185页
【教学课件】第3章汇编语言程序设计.ppt_第5页
第5页 / 共185页
点击查看更多>>
资源描述

《【教学课件】第3章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第3章汇编语言程序设计.ppt(185页珍藏版)》请在三一办公上搜索。

1、第3章 汇编语言程序设计,3.1 概述指令:计算机完成某种操作的命令程序:完成某种功能的指令序列软件:各种程序总称机器代码,汇编语言程序,汇编程序汇编语言程序建立步骤:()用编辑程序建立.ASM源文件()用LINK程序把.ASM文件转换为OBJ文件()用LINK程序把.OBJ文件转换为.EXE文件,或用EXEBIN程序把.EXE文件转换为.COM文件()在DOS下直接键入.EXE文件或.COM文件的文件名就可运行该程序,3.2 语句格式,语句格式:名字 操作符 操作数1,操作数2;注释 1名字一种符号地址组成:AZ,az,09,专用符号?、.、_、$限制:第一个字符不能为数字“.”必须为第一个

2、字符 前31个字符有效 不能为关键字类型:标号:指令符号地址 变量:数据符号地址2操作符组成:CPU指令,伪指令,宏指令3操作数指定参与操作的数据,或数据所在单元地址4注释说明程序、指令功能,增加程序可读性,3.3 伪指令,功能:指示汇编程序完成规定的操作,如选择处理器,定义数据,分配存储器等。,一、程序开始与结束,1程序开始:可以用name,title给程序起名。格式:NAME module_name汇编程序以模块名作为模块的名字,若未使用NAME,则可用TITLE给程序指定标题格式:TITLE text文本在每一页上打印出来,若没有NAME,则text的前6个字符为模块名,text最多为6

3、0个字符。若未使用NAME、TITLE,则源文件名为模块名。2程序结束:表示原程序结束,不可缺,源程序的最后一条语句。格式:END label标号指示程序开始执行的起始地址,多个模块连接,主程序用标号,其他程序不用,主程序缺省值为代码段第一条指令。3MASM 6.0 定义的入口点、出口点入口点:.STARUP;产生设置DS、SS、SP代码,此时,END不用标号。出口点:.EXIT;返回操作系统,常用值为0。例:.STARUP.EXIT 0 END,二、处理器选择,功能:选择对应的指令集,也即对应的汇编执行语句集放在程序最前面缺省值为.8086此类指令主要有:.8086 选择8086指令系统.2

4、86 选择80286指令系统.286P 选择保护方式下80286指令系统.386 选择80386指令系统.386P 选择保护方式下80386指令系统.486 选择80486指令系统.486P 选择保护方式下80486指令系统.586 选择Pentium指令系统.586P 选择保护方式下Pentium指令系统,吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟 教授 总学时:80 吉林大学计算机科学与技术学院,第 二十 讲,三、段定义,段定义:确定代码组织与数据存储的方式 2种:完整的段定义和简化的段定义(MASM 5.0以上)完整的段定义包括:(1)segment和end段定义(2)AS

5、SUME段分配(3)GROUP 段组定义,segment和end段定义(1),格式:段名 segment 定位类型组合类型 字长类型类别 段名 end功能:定义段名、段属性。一般情况下,选项可以不用,用默认值,但若需连接本程序和其他程序,就要使用这些说明。段名是段的标识符,指明段的基址,由程序员指定。,segment和end段定义(2),定位类型定位类型:指定段起始边界,5种BYTE:任意位置WORD:偶地址,地址低1位为0DWORD:4的倍数地址,地址低2位为0PARA:16的倍数地址,地址低4位为0PAGE:256的倍数地址,地址低8位为0,一页的起点,默认值。,segment和end段定

6、义(3),组合类型组合类型:表示本段与其它段之间,具有相同段名的各段的组合关系,为连接程序提供信息,属于连接类型,6种。PUBLIC:本段连接时将与有相同段名.public类型的其它段连接在一起,连接次序由连接命令指定(共用一个段),即同名段连接在一起,有共同段地址。STACK:用于说明堆栈段,把不同程序段中的具有SARCK类型的同名段组合而形成一个堆栈段,其长度为各原有段的总和,LINK自动将新段的段地址送SS,长度送SP,若未定义SARCK类型,需在程序中用指令设置SS、SP。COMMON:本段连接时,使具有COMMON类型的同名段具有同一个起始地址,所以会产生覆盖,新段的长度是最长COM

7、MON段的长度,新段的内容取决于依次覆盖的最后内容。MEMORY:表示该段应定位在所有段的最下面(即地址最大的区域),如果模块中不止一个MEMORY段,以第一个遇到的作为MEMORY段,其它段作为COMMON段处理,而LINK程序在处理MEMORY时与PUBLIC同样对待。PRIVATE:独立段,与其它段逻辑上没有关系,不与同名段合并,默认值。AT 表达式:指定本段起始地址为“表达式”,偏移量为0,不能用于代码段。,segment和end段定义(4),字长类型字长类型:386以后,说明使用16位寻址方式,还是32位寻址方式。.USE16:16位寻址方式,段长64KB,16位段地址,16位偏移量

8、,默认值。.USE32:32位寻址方式,段长4GB,16位段地址,32位偏移量。类别类别:引号括起的字符串,连接时,类别相同的分段(他们可能不同名)均放在连续的存储空间中,但他们仍然是不同的分段(连续空间)。,ASSUME段分配,格式:ASSUME 段寄存器名:段名,功能:指定分段寄存器,说明哪个段使用哪个段寄存器。说明:程序段必须用CS,堆栈段必须用SS该语句一般放在代码段的最前面说明性语句,除CS外(初始化赋值),各段寄存器在程序中赋值。取消语句:ASSUME NOTHING,一般汇编格式举例,DATA1 SEGMENT DATA DATA1 ENDSDATA2 SEGMENT EXTRA

9、 DATA2 ENDSDATA3 SEGMENT DATA DATA3 ENDSCODE SEGMENT CODE ASSUME CS:CODE,DS:DATA1,ES:DATA3,SS:DATA2START:MOV AX,DATA1 MOV DS,AX;数据段地址赋给DS MOV AX,DATA2 MOV SS,AX;堆栈段地址赋给SS MOV AX,DATA3 MOV ES,AX;附加段地址赋给ES MOV AH,4CH INT 21H;返回DOSCODE ENDS END START,GROUP 段组定义,格式:段组名 GROUP 段名,段名功能:将指定的所有段分配在同一个物理存储器内,

10、使用同一个组名,使用同一个DS内容。用户自行指定段组中的段,段组不影响各段次序,对定义在不同段中的变量,可以用同一个DS访问,但各段仍为独立段,通常将具有相同性质的段分在一个段组。举例:DATA1 SEGMENT DATA DATA1 ENDS DATA2 SEGMENT DATA DATA2 ENDS AA5 GROUP DATA1,DATA2 CODE SEGMENT CODE ASSUME CS:CODE,DS:AA5 START:MOV AX,AA5 MOV DS,AX;数据段地址赋给DS MOV AH,4CH INT 21H;返回DOS CODE ENDS END START,简化的

11、段定义,MASM 5.0以上支持的段定义,不像SEGMENT定义得那么完善,但易用。简化段有利于汇编语言程序模块与高级语言程序模块的连接,但.COM程序不能用简化段定义。,四、地址计数器伪指令,1地址计数器$功能:指出汇编地址,是偏移量,记载下一个变量或指令在当前段中的偏移量。每个段开始时,$0,随着汇编过程的进行而增值,每处理一条指令,$增加一个值,此值为该指令所需的字节数。允许直接引用$,如:JNE$6;转向JNE指令的首地址加上6。$用于指令时,表示本条指令的第一个字节地址,$用于其他情况,表示$的当前值。2ORG 起始地址定义格式:ORG 表达式功能:定义指令或数据的起始地址,把表达式

12、的值送给$(地址计数器)3EVEN 偶数地址定义功能:使下一个变量或指令从偶数地址开始,便于字存储对准(EVEN在代码段中可能多出一个NOP语句)。4ALIGN 边界定义格式:ALIGN n;n为2的幂次功能:使下一个变量或指令从n的接续整数倍地址开始,保证双字、四倍字对准。,五、数据定义,格式:变量名 操作符 操作数;注释功能:为操作数分配存储单元,用变量与存储单元联系。为变量分配存储单元,并预置初值。操作符:DB:一个操作数占有1个字节单元(8位),定义的变量为字节变量。DW:一个操作数占有1个字单元(16位),定义的变量为字变量。DD:一个操作数占有1个双字单元(32位),定义的变量为双

13、字变量。DF:一个操作数占有1个三字单元(48位),定义的变量为三字变量。DQ:一个操作数占有1个四字单元(64位),定义的变量为四字变量。DT:一个操作数占有1个五字单元(80位),定义的变量为五字变量。操作数:常数、表达式、字符串、?,数据定义举例(1),ORG 200H;设置$DATA1 DB 12H,2+6,34HEVEN;偶地址,使$指向偶地址DATA2 DW 789AHALIGN 4;4倍地址,使$指向4倍地址DATA3 DD 12345678HDATA4 DW$,6699H;$为汇编指针,16位,设置当前$(原$)的内容,吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟

14、教授 总学时:80 吉林大学计算机科学与技术学院,第 二十一 讲,数据定义举例(2),ORG 100HDATA1 DB abcd;字符串必须用单引号DATA2 DB AB DATA3 DW AB;按字处理,个数只能为2,数据定义举例(3),ORG 400HDATA1 DB 1,2,?,4;按字节定义DATA2 DW 5,?,6;按字定义DATA3 DF?;按三字定义DATA4 DB 8,数据定义举例(4),ORG 300HDATA1 DB 2 DUP(12H,34H,56H),数据定义举例(5),ORG 100HDATA1 DB 12H,34H,2 DUP(56H,3 DUP(9AH),78H

15、),六、PROC、ENDP过程定义,功能:用于定义子程序结构,过程名是CALL的操作数。格式:过程名 PROC 属性 过程名 ENDP属性:FAR,NEAR(默认值),吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟 教授 总学时:80 吉林大学计算机科学与技术学院,第 二十二 讲,七、模块连接伪指令,用于定义各模块之间的共享信息1PUBLIC格式:PUBLIC 符号1,符号2,功能:公共引用,说明本模块定义,而其它模块引用的共享信息。2EXTRN格式:EXTRN 符号1:类型,符号2:类型,功能:外部引用,说明其他模块定义,而本模块引用的共享信息。类型:对于变量,可以是字节(BYTE

16、),字(WORD),双字(DWORD),三字(FWORD),四字(QWORD),五字(TWORD)。对于标号、过程名,可以是段内引用型(FAR),段间引用型(NEAR)。共享信息是全局变量,包括常量、变量、标号、过程名等。EXTRN说明的信息应是在PUBLIC中已经定义的,否则出错。例:PUBLIC VAR1,VAR2 EXTRN VAR1:WORD,VAR2:BYTE,3.4 操作数字段,操作数字段可以是寄存器、标号、变量、常数、表达式等。寄存器、标号、变量已作介绍,本节重点介绍常数、表达式。,一、常数(1),包括:数值常数、字符串常数、符号常数1数值常数数值常数可以是二进制数、八进制数、十

17、进制数、十六进制数。基数控制伪指令:改变基数默认值(原默认值为十进制)。格式:.RADIX 数值表达式功能:把默认的基数改变为216范围内的任何基数。例:MOV BX,0FFH 等价于.RADIX 16 MOV BX,178 MOV BX,0FFH MOV BX,178D2字符串常数字符串常数:包括在单引号中的若干字符。字符串在存储器中储存的是相应字符的ASCII码。,一、常数(2),3符号常数包括:EQU和(1)EQU赋值伪指令格式:符号常数名 EQU 表达式功能:将表达式的值赋给符号常数。说明:表达式可以是有效的操作数格式,也可以是任何可求出数值常数的表达式,还可以是任何有效的符号(如操作

18、符、寄存器名、变量名等)。EQU定义的一个符号常数名在程序中只能定义一次。例:DATA1 EQU 88 NEW_CX EQU CX DATA2 EQU DATA1+12(2)伪指令格式:符号常数名 表达式功能:将表达式的值赋给符号常数。定义的一个符号常数名在程序中可以重复定义多次。例:DATA1=88 DATA1=DATA1+99,二、表达式(1),表达式:常数、寄存器、标号、变量与一些运算符相组合的序列。包括:数值表达式,地址表达式。1运算符六种运算:算术运算、逻辑运算、移位运算、关系运算、返回值运算、属性运算。(1)算术运算符算术运算符:有5个,加()、减()、乘()、除(/)和取余(MO

19、D)。(2)逻辑运算符逻辑运算符:4个,与(AND)、或(OR)、非(NOT)和异或(XOR)。,二、表达式(2),(3)移位运算符移位运算符:2个,左移(SHL)和右移(SHR)。例:MOV AL,0 MOV BL,11011000B MOV AL,BL SHR 3;(AL)=00011011B MOV CL,BL SHL 6;(CL)=11000000B(4)关系运算符关系运算符:6个,等于(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)、大于等于(GT)。功能:关系运算符的两个操作数的计算结果应为逻辑值,结果为真(关系成立),表示为0FFFFH,结果为假(关系不成立)

20、,表示为0。例:MOV AX,2 LT 7;(AX)=0FFFFH,二、表达式(3),(5)返回值运算符返回值运算符:5个,返回变量或标号的段地址(SEG)、返回变量或标号的偏移地址(OFFSET)、返回变量或标号的类型值(TYPE)、返回变量的单元数(LENGTH)、返回变量的字节数(SIZE)。SEG返回变量或标号的段地址运算符格式:操作数 SEG 变量/标号功能:将变量/标号所在段的段基址值赋给操作数。OFFSET返回变量或标号的偏移地址运算符格式:操作数 OFFSET 变量/标号功能:将变量/标号所在段中的偏移值赋给操作数。TYPE返回变量或标号的类型值运算符格式:操作数 TYPE 变

21、量/标号功能:将代表变量/标号类型的值赋给操作数。说明:如果是变量,则汇编程序将根据变量对应的数据定义伪指令回送类型值(即变量类型代表的字节数):DB为1,DW为2,DD为4,DF为6,DQ为8,DT为10。返回以字节数表示的类型,常数返回0。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为1,FAR为2。,二、表达式(4),LENGTH返回变量的单元数运算符格式:操作数 LENGTH 变量功能:将代表变量的单元数赋给操作数。说明:返回一次数据定义的第一个元素的长度,DUP时返回重复次数,其他情况返回1。对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数(按类型TYPE

22、算),而对于其他情况,则均送1。只对DUP定义的变量有意义,返回分配给该变量的元素的个数。只返回第一个DUP前的元素个数,与DUP括号内的数据无关,认为只是一组数据而已,若与DUP并列地定义了其它数据,就只能返回1。SIZE返回变量的字节数运算符格式:操作数 SIZE 变量功能:将代表变量的字节数赋给操作数。说明:就是返回LENGTHTYPE的结果。汇编程序将回送分配给该变量的字节数。只对DUP定义的变量有意义。,吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟 教授 总学时:80 吉林大学计算机科学与技术学院,第 二十三 讲,二、表达式(5),例:DATA SEGMENT AT 10

23、00H ORG 3000HAA1 DW 100 DUP(0)BB1 DW 1,2CC1 DB ABCDDD1 DW 1000 DUP(2,3)EE1 DB 50 DUP(5,6)FF1 DW 1,2,100 DUP(?)GG1 DD 5 DUP(6 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAHH1:MOV AX,DATA;AX=1000H MOV DS,AX MOV AX,SEG AA1;AX=1000H,AT定义 MOV BX,OFFSET AA1;BX=3000H MOV CL,TYPE AA1;CL=2,字类型 MOV CH,TY

24、PE CC1;CH=1,字节类型 MOV AL,TYPE GG1;AL=4,双字类型,二、表达式(6),MOV DX,LENGTH AA1;DX=100,元素个数 MOV AX,SIZE AA1;AX=200,元素个数类型 MOV DX,LENGTH BB1;DX=1,LENGTH只对DUP定义的变量有意义 MOV AX,SIZE BB1;AX=2 MOV DX,LENGTH CC1;DX=1 MOV AX,SIZE CC1;AX=1 MOV DX,LENGTH DD1;DX=1000 MOV AX,TYPE DD1;AX=2000 MOV DX,LENGTH EE1;DX=50 MOV AX

25、,SIZE EE1;AX=50 MOV DX,LENGTH FF1;DX=1 MOV AX,TYPE FF1;AX=2 MOV DX,LENGTH GG1;DX=5 MOV AX,TYPE GG1;AX=20 MOV AH,4CH INT 21HCODE ENDS END HH1,二、表达式(7),(6)属性运算符属性运算符:3个,临时改变类型属性运算符PTR、指定类型属性运算符THIS、定义类型属性运算符LABEL。PTR 临时改变类型属性运算符格式:类型 PTR 变量/标号功能:将PTR前面的类型临时赋给变量/标号,而原有段属性和偏移属性保持不变,其本身并不分配存储单元。说明:对于变量,可

26、以指定类型BYTE、WORD、DWOR、DFWORD、QWORD、TWORD。对于标号,可以指定类型NEARFAR例:DATA DB 66H,77H MOV AX,WORD PRT DATA,二、表达式(8),THIS 指定类型属性运算符格式:变量/标号 EQU THIS 类型 功能:将变量或标号定义成指定的类型。说明:THIS指定的变量或标号本身并不分配存储单元,它与紧跟其后的变量或标号只有类型不同,而段地址和偏移量均相同。THIS指定类型与PTR相同。例:DATA1 EQU THIS BYTE DATA2 DW 1234H;DATA1和DATA2具有相同的段地址和偏移量,但类型值分别为1和

27、2。MOV AX,DATA2;AX=1234H MOV BL,DATA1;BL=34H,二、表达式(9),LABEL 定义类型属性运算符格式:变量/标号 LABEL 类型功能:将变量或标号定义成指定的类型。说明:LABEL指定的变量或标号本身并不分配存储单元,它与紧跟其后的变量或标号只有类型不同,而段地址和偏移量均相同。THIS指定类型与PTR相同。例:AA1 LABEL FAR;AA1为段间转移入口 AA2:;AA2为段内转移入口 AA3 LABEL BYTE AA4 DW 1234H MOV AX,AA4 MOV BH,AA3+1,二、表达式(10),2数字表达式数字表达式:有常数、变量、

28、标号与一些运算符相组合的序列。运算符可以是算术运算符、逻辑运算符、移位运算符、关系运算符、返回值运算符,但结果必须是常数。3标号标号:指令所在单元的符号地址。标号的三种属性:段地址、偏移量、类型(NEAR、FAR)。4变量变量:数据所在单元的符号地址。变量的五种属性:段地址(SEG返回值)、偏移量(OFFSET返回值)、类型(TYPE返回值)、单元数(LENGTH返回值)、字节数(SIZE返回值)5地址表达式地址表达式:存储器地址,即EA的计算。是常数、变量、标号与一些运算符相组合的序列。,吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟 教授 总学时:80 吉林大学计算机科学与技术学

29、院,第 二十四 讲,3.5 汇编语言程序设计及举例(1),(一)编写汇编语言程序的步骤1.从实际问题抽象出数学模型。2.确定解决此数学模型的算法。解决同一个问题可以有不同的算法。它们的效率可能有很大的差别。例如要做X*10,可以用乘法指令;也可以用X*8+X*2,而X*2或X*8也可以自身相加,或X左移来实现;这些方法的程序复杂程度和执行时间差别是很大的。又例如查表,是用线性查找还是用对分查找区别也很大。所以,确定合适的算法是很重要的。3.画出程序流程图。把根据算法解决问题的思路和方法,用图形表示出来。4.分配内存工作单元和寄存器。5.根据流程图编制程序。当然,到这儿只是设计出了基本程序,此程

30、序是否正确,可靠,还必须上机调试,排错和进行不要的检测。(二)判断程序质量的标准为解决同一个问题所编制的程序,往往是多种多样的,如何衡量程序的质量呢?通常有三个标准:1.程序的执行时间 2.程序所占用的内存字节数 3.程序的语句行数前两个标准是主要的,由于半导体存储器容量越来越大,成本急剧降低。,3.5 汇编语言程序设计及举例(2),(三)程序流程图在确定问题的算法以后,先不要急于写一条条指令,而要用程序流程图把编制程序的方法和思路勾画出来,确定程序的结构和相互之间的关系。本书中的流程图,采用以下一些惯用的画法。1.用方框表示工作框,方框中用简明的语言标明所完成的特定功能。它有一个入口一个出口

31、,用箭头表示。2.用菱形表示判断框,菱形内标明比较,判断和条件。它有一个入口和几个出口,各用箭头表示。在各个出口处标明出口条件,条件成立则写“是(用Y表示)”,条件不成立用“否(用N表示)”。3.程序中要调用的子程序或过程,用 框表示,在框中标明子程序或过程的名字(包括入口地址、入口条件、参数、出口参数)。它有一个入口一个出口,各用箭头表示。带箭头的直线。程序的各框之间用箭头的直线连接起来,表示程序的走向。,算术运算程序设计(直线运行程序),最简单的程序是没有分支,没有循环的直线运行程序。在8088/8086中,数据是16位的,它只有16位的运算指令,若是两个32位的数相乘就无法直接用指令实现

32、(在80386中有32位数相乘的指令),但可以用16位乘法指令做4次乘法,然后把部分积相加来实现。其原理如图所示。,算术运算程序设计(1),例1:两个32位无符号数乘法程序若数据区中已有一个缓冲区存放了32位的被乘数和乘数,保留了64位的空间以存放乘积,能实现上述运算的程序流程图如图所示,算术运算程序设计(2),相应的程序为:name 32bit mutiptydatasegmentmulnum dw 0000,0ffffh,0000,0ffffh,4 dup(?)dataendsstacksegmentpara stack stackdb100 dup(?)stackendscode seg

33、ment assumecs:code,ds:data,ss:stack,es:datastart proc farbegin:push ds;DS中包含的是程序段前缀的起始地址 mov ax,0 push ax;设置返回至DOS的段值和IP值 mov ax,data mov ds,axmov es,ax;置段寄存器初值lea bx,mulnummulu32:mov ax,bx;B-AX,算术运算程序设计(3),mov si,bx+4;D-SI mov di,bx+6;C-DI mul si;BD mov bx+8,ax;保存部分积Imov bx+0ah,dx mov ax.,bx+2;A-AX

34、 mul si;AD add ax,bx+0ah adc dx,0;部分积2的一部分与部分积1的相应部分相加 mov bx+0ah,ax mov bx+0ch,dx;保存 mov ax,bx;B-AX mul di;BC add ax,bx+0ah;与部分积3的相应部分相加 adc dx,bx+0ch,算术运算程序设计(4),mov bx+0ah,ax mov bx+0ch,dx pushf;保存后一次相加的进位位 mov ax,bx+2;A-AX mul di;AC popf adc ax,bx+0ch;与部分积4的相加部分相加 adc dx,0 mov bx+0ch,ax mov bx+0

35、eh,dx retstart endpcode ends end begin,吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟 教授 总学时:80 吉林大学计算机科学与技术学院,第 二十五 讲,算术运算程序设计(5),例2:32位符号数乘法在32位无符号数乘法程序的基础上很容易实现32位带符号数的乘法。首先设一个乘积的符号标志初值为0;检查被乘数,若为负,一方面对被乘数取补,另一方面对符号标志取反;再检查乘数,若是负数也对乘数取补和符号标志取反;然而调用32位无符号数乘法程序。最后检查乘积符号标志,若为负(即两个异号数相乘),则对64为乘积取补。程序流程图如图所示。,算术运算程序设计(

36、6),相应的程序为name signed 32 bit mulptydatasegmentsigndb?mulnumdw 0X1,X2,Y1,4 dup(?)dataendsstacksegment para stack stackdb100 dup(?)stackendscodesegmentassume cs:code,ds:data,ss:stack;以下是主过程startprocfarbegin:pushdsmovax,0pushax;为返回DOS设置返回地址,算术运算程序设计(7),movax,datamovds,ax;设置段寄存器初值movsign,0;置符号为初值leabx,mu

37、lnummovax,bx;B-AXmovdx,bx+2;A-DX movsi,bx+4;D-SI movsi,bx+6;C-DI cmpdx,0;检验正或负 jnsother;为正时转至OTHRE notax notdx addax,1 adcdx,0;负则取补 not sign;改变符号位 movbx,ax movbx+2,dx;暂存,算术运算程序设计(8),other:cmpdi,0;检查乘数符号jnsgomul;为正时转至GOMUL notsi notdi addsi,1 adcdi,0;为负则取补 notsign;实现符号运算gomul:callmulu32;调用32位无符号数乘法程序

38、cmpsign,0;检查乘积的符号jedone;乘积为正则结束notbx+8notbx+0ahnotbx+0chnotbx+0ehaddword ptr bx+8,1addword ptr bx+0ah,0 adc word ptr bx+0ch,0adc word ptr bx+0eh,0;乘积取补 done:retstartendp,算术运算程序设计(9),;以下是32位无符号数的乘法程序mul32procmovax,bxmulsimovbx+8,axmovbx+0ah,dxmov ax,bx+2mulsiaddax,bx+0ahadcdx,0movbx+0ah,axmovbx+0ch,d

39、x movax,bxmuldiaddax,bx+0ahadcdx,bx+0chmovbx+0ah,axmovbx+0ch,dxpushf,算术运算程序设计(10),movax,bx+2muldipopfadcax,bx+0chadcdx,0 movbx+0ch,axmov bx+0ch,dxretmulu32endpcodeendsendbegin,分支程序设计(1),在一个实际的程序中,程序始终是直线执行的情况是不多见的,通常都会有各种分支,例如变量x的符号函数用下式表示 1 当 x0 y=0当 x=0-1 当 x0在程序中,要根据x的值给y赋值如图所示。先把变量x从内存中取出来,执行一次“

40、与”或“或”操作,就可以把x值的特征反映到标志位上。于是就可以判断是否等于零,若是,则令y=0;若否,再判断是否小于零,若是,则令y=-1;不是,就令y=1。相应的程序为:,SIGEF:MOVAX,BUFFERORAX,AXJEZEROJNSPLUSMOVBX,0FFHJMPCONTIZERO:MOVBX,0JMPCONTIPLUS:MOV BX,1 CONTI:,分支程序设计(2),例1:根据AL中的被置位的情况来控制转移到8个子程序R1R8中的一个(在中断响应时,通过软件查询,从而转到相应的中断服务程序入口就类似于这种情况)。如果AL中为00000001则转至R1如果AL中为0000001

41、0则转至R2如果AL中为00000100则转至R3如果AL中为00001000则转至R4如果AL中为00010000则转至R5如果AL中为00100000则转至R6如果AL中为01000000则转至R7如果AL中为10000000则转至R8,分支程序设计(3),实现上述要求的程序框图如图所示我们可以把8个子程序的入口地址编成如图所示的分支表。,分支程序设计(4),根据流程图可以写出下程序:NAMEBRANCH_PROGDATASEGMENTBRTABDWR11;子程序R1入口地址的IP值DWR12;子程序R1入口地址的码段值DWR21 DWR22DWR31DWR32DWR41DWR42DWR5

42、1DWR52DWR61DWR62DWR71DWR72DWR81DWR82DATA ENDSSTACK SEGMENTPARA STACK STACKDB100 DUP(?)TOPEQU$-STACK STACKENDS,分支程序设计(5),CODESEGMENTSTACKPROCFARASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOV DS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXLEABX,BRTAB;设跳转表的地址指针GTBIT:RCRAL,1JCGETAD;顺序检查A

43、L中各位的状态INCBXINCBXINCBXINCBXJMPGTBITGETAD:JMPDWORD PTR BX;段间间接转移STARKENDPCODEENDSENDBEGIN,循环程序设计(1),在程序中,往往要求某一段程序重复执行多次,这时候可以利用循环程序结构。一个循环结构由以下几部分组成:1.循环体:就是要求重复执行的程序段部分。其中又分为:循环工作部分和循环控制部分。循环控制部分每循环一次检查循环结束的条件,当满足条件时就停止循环,往下执行其他程序。2.循环结束条件:在循环程序中必须给出循环结束的条件,否则程序就会进入死循环。常见的循环是计数循环,当循环了一定次数后就结束循环.在微型

44、机中,常用一个内部寄存器(或寄存器对)作为计数器,通常这个计数器的初值置以循环次数,每循环一次令其减1,当计数器减为0时,就停止循环。也可以初值置0,每循环一次加1,再与循环次数相比较,若两者相等就停止循环。循环结束条件还可以有多种,下面结合例子分别介绍。3.循环初态:用于循环过程中的工作单元,在循环开始时往往要置以初态,即分别给他们赋一个初值。循环初态又可以分成两部分,一是循环工作部分初态,另一是结束条件的初态,例如,要设地址指针,要使某些寄存器清零,或设某些标志等等。循环结束条件的初态往往置以循环次数。置初态也是循环程序重要的一部分,不注意往往容易出错。,循环程序设计(2),在循环程序中,

45、控制循环的方法因要求不同而有若干中。1.用计数器控制循环这是一种最常用也是最普通的循环控制循环的方法例1:在一串给定个数的数中寻找最大值(或最小值),放至指定的存储单元。每个数用16位表示。,NAMESEARCH_MAXDATASEGMENTBUFFERDWX1,X2,.XnCOUNTEQU$-BUFFERMAXDW?DATAENDSSTACKSEGMENTPARA STACK STACKDB64 DUP(?)TOPEQU$-STACKSTACKENDSCODESEGMENTSTARTPROCFAR ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSH DSMOVA

46、X,0PUSHAX MOVAX,DATA,MOVDS,AX MOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVCX,COUNT LEABX,BUFFERMOV AX,BXINCBX DECCXAGAIN:CMPAX,BXJGENEXTMOVAX,BXNEXT:INC BXLOOPAGAINSTARTENDPCODEENDSENDSTART,循环程序设计(3),2.按问题的条件控制循环有些循环程序的循环次数是不知道或不确定的,而是要根据条件来确定是否循环,例如当满足条件时循环(或不循环),于是就要按条件控制循环例2:求一个16位(或32位)无符号数的整数平方根。所用的

47、方法是逐次逼近的古典法(牛顿法).这种方法指出:若X1是数N的平方根的近似值,那么 X2=(N/X1X1)/2 是一个更接近的近似值。即若数N的平方根有确定的值。第一个近似值可使用公式(N/200+2)得到;用第一个近似值除N,然后对两个结果求平均值,就是第二个近似值;用它去除N再与第二个近似值求平均值就得到了第三个近似值 例如,N=90000,则第一次近似值为:90000/200+2=452 90000/452=199(452+199)/2=326=X1;90000/326=276(326+276)/2=301=X2;90000/301=299(301+299)/2=300=X3;90000

48、/300=300就可以确定90000的平方根为300。但是,并不是一个整数都具有整数的平方根,所以就要取近似值。怎么求得近似值呢?一种是控制逐次逼近的次数,例如要求逼近10次,就认为这个近似值以足够精确了;另一种是给定一个误差,只要相邻两次逼近所得值的差小于这个误差就停止计算。本例中按照第二种方法设计程序,给定误差为1。所以,程序的循环要由给定的条件来控制。,循环程序设计(4),能实现这种算法的程序流程图如图所示。根据流程,可写出如下程序:nameget_square_rootdatasegmentnumdw2710hresultdw?digitequ200dataendsstacksegme

49、ntpara stack stackdb100 dup(?)stackendscode segmentassumecs:code,ds:data,ss:stackstartprocfarbegin:pushds movax,0push ax;为返回DOS设置返回地址 mov ax,datamovds,axmovex,ax;置段寄存器 leabx,nummov ax,bx,循环程序设计(5),movsi,axmovdi,digitcwddivdi;第一次试探N/200addax,2;AX中为第一次试探值conti:movcx,axmovax,si;NAXcwddivcxaddax,cxshrax

50、,1;得到新的试探值 movdx,ax;与上一个试探值比较subdx,ax;相等则结束循环je done;若差为1也结束循环cmpdx,1jedonecmpdx,-1jnecontidone:movbx+2,ax;存结果retstartendpcodeendsendbegin,由于在8088中,数是用整数表示的,所以用上述办法求平方根的应用范围是十分有限的。若要求实数的平方根就要用8087数值协处理器。,吉林大学远程教育学院,微机原理及汇编语言,主讲人:赵宏伟 教授 总学时:80 吉林大学计算机科学与技术学院,第 二十七 讲,循环程序设计(6),例3:规格化一个二进制数在8088中数是以二进制

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号