欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第3章汇编语言程序设计.ppt

    • 资源ID:2603189       资源大小:2.17MB        全文页数:185页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第3章汇编语言程序设计.ppt

    第3章 汇编语言程序设计,3.1 概述 指令:计算机完成某种操作的命令 程序:完成某种功能的指令序列 软件:各种程序总称 机器代码,汇编语言程序,汇编程序 汇编语言程序建立步骤: ()用编辑程序建立.ASM源文件 ()用LINK程序把.ASM文件转换为OBJ文件 ()用LINK程序把.OBJ文件转换为.EXE文件,或用EXEBIN程序把.EXE文件转换为.COM文件 ()在DOS下直接键入.EXE文件或.COM文件的文件名就可运行该程序,3.2 语句格式,语句格式:名字 操作符 操作数1,操作数2 ;注释 1名字 一种符号地址 组成:AZ,az,09,专用符号?、.、_、$ 限制:第一个字符不能为数字 “.”必须为第一个字符 前31个字符有效 不能为关键字 类型: 标号:指令符号地址 变量:数据符号地址 2操作符 组成:CPU指令,伪指令,宏指令 3操作数 指定参与操作的数据,或数据所在单元地址 4注释 说明程序、指令功能,增加程序可读性,3.3 伪指令,功能:指示汇编程序完成规定的操作,如选择处理器,定义数据,分配存储器等。,一、程序开始与结束,1程序开始:可以用name,title给程序起名。 格式:NAME module_name 汇编程序以模块名作为模块的名字,若未使用NAME,则可用TITLE给程序指定标题 格式:TITLE text 文本在每一页上打印出来,若没有NAME,则text的前6个字符为模块名,text最多为60个字符。 若未使用NAME、TITLE,则源文件名为模块名。 2程序结束:表示原程序结束,不可缺,源程序的最后一条语句。 格式:END label 标号指示程序开始执行的起始地址,多个模块连接,主程序用标号,其他程序不用,主程序缺省值为代码段第一条指令。 3MASM 6.0 定义的入口点、出口点 入口点:.STARUP ;产生设置DS、SS、SP代码,此时,END不用标号。 出口点: .EXIT ;返回操作系统,常用值为0。 例: .STARUP .EXIT 0 END,二、处理器选择,功能:选择对应的指令集,也即对应的汇编执行语句集 放在程序最前面 缺省值为.8086 此类指令主要有: .8086 选择8086指令系统 .286 选择80286指令系统 .286P 选择保护方式下80286指令系统 .386 选择80386指令系统 .386P 选择保护方式下80386指令系统 .486 选择80486指令系统 .486P 选择保护方式下80486指令系统 .586 选择Pentium指令系统 .586P 选择保护方式下Pentium指令系统,吉林大学远程教育学院,微机原理及汇编语言,主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院,第 二十 讲,三、段定义,段定义:确定代码组织与数据存储的方式 2种:完整的段定义和简化的段定义(MASM 5.0以上) 完整的段定义包括: (1)segment和end段定义 (2)ASSUME段分配 (3)GROUP 段组定义,segment和end段定义 (1),格式: 段名 segment 定位类型组合类型 字长类型类别 段名 end 功能:定义段名、段属性。 一般情况下,选项可以不用,用默认值,但若需连接本程序和其他程序,就要使用这些说明。 段名是段的标识符,指明段的基址,由程序员指定。,segment和end段定义 (2),定位类型 定位类型:指定段起始边界,5种 BYTE: 任意位置 WORD: 偶地址,地址低1位为0 DWORD:4的倍数地址,地址低2位为0 PARA: 16的倍数地址,地址低4位为0 PAGE: 256的倍数地址,地址低8位为0,一页的起点,默认值。,segment和end段定义 (3),组合类型 组合类型:表示本段与其它段之间,具有相同段名的各段的组合关系,为连接程序提供信息,属于连接类型,6种。 PUBLIC:本段连接时将与有相同段名.public类型的其它段连接在一起,连接次序由连接命令指定(共用一个段),即同名段连接在一起,有共同段地址。 STACK:用于说明堆栈段,把不同程序段中的具有SARCK类型的同名段组合而形成一个堆栈段,其长度为各原有段的总和,LINK自动将新段的段地址送SS,长度送SP,若未定义SARCK类型,需在程序中用指令设置SS、SP。 COMMON:本段连接时,使具有COMMON类型的同名段具有同一个起始地址,所以会产生覆盖,新段的长度是最长COMMON段的长度,新段的内容取决于依次覆盖的最后内容。 MEMORY:表示该段应定位在所有段的最下面(即地址最大的区域),如果模块中不止一个MEMORY段,以第一个遇到的作为MEMORY段,其它段作为COMMON段处理,而LINK程序在处理MEMORY时与PUBLIC同样对待。 PRIVATE:独立段,与其它段逻辑上没有关系,不与同名段合并,默认值。 AT 表达式:指定本段起始地址为“表达式”,偏移量为0,不能用于代码段。,segment和end段定义 (4),字长类型 字长类型: 386以后,说明使用16位寻址方式,还是32位寻址方式。 .USE16: 16位寻址方式,段长64KB,16位段地址,16位偏移量,默认值。 .USE32: 32位寻址方式,段长4GB,16位段地址,32位偏移量。 类别 类别:引号括起的字符串,连接时,类别相同的分段(他们可能不同名)均放在连续的存储空间中,但他们仍然是不同的分段(连续空间)。,ASSUME段分配,格式:ASSUME 段寄存器名:段名, 功能:指定分段寄存器,说明哪个段使用哪个段寄存器。 说明: 程序段必须用CS,堆栈段必须用SS 该语句一般放在代码段的最前面 说明性语句,除CS外(初始化赋值),各段寄存器在程序中赋值。 取消语句:ASSUME NOTHING,一般汇编格式举例,DATA1 SEGMENT DATA DATA1 ENDS DATA2 SEGMENT EXTRA DATA2 ENDS DATA3 SEGMENT DATA DATA3 ENDS CODE SEGMENT CODE ASSUME CS:CODE,DS:DATA1,ES:DATA3,SS:DATA2 START: 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 ;返回DOS CODE ENDS END START,GROUP 段组定义,格式:段组名 GROUP 段名,段名 功能:将指定的所有段分配在同一个物理存储器内,使用同一个组名,使用同一个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,简化的段定义,MASM 5.0以上支持的段定义,不像SEGMENT定义得那么完善,但易用。 简化段有利于汇编语言程序模块与高级语言程序模块的连接,但.COM程序不能用简化段定义。,四、地址计数器伪指令,1地址计数器$ 功能:指出汇编地址,是偏移量,记载下一个变量或指令在当前段中的偏移量。 每个段开始时,$0,随着汇编过程的进行而增值,每处理一条指令,$增加一个值,此值为该指令所需的字节数。 允许直接引用$,如:JNE $6 ;转向JNE指令的首地址加上6。 $用于指令时,表示本条指令的第一个字节地址,$用于其他情况,表示$的当前值。 2ORG 起始地址定义 格式: ORG 表达式 功能:定义指令或数据的起始地址,把表达式的值送给$(地址计数器) 3EVEN 偶数地址定义 功能:使下一个变量或指令从偶数地址开始,便于字存储对准(EVEN在代码段中可能多出一个NOP语句)。 4ALIGN 边界定义 格式:ALIGN n ;n为2的幂次 功能:使下一个变量或指令从n的接续整数倍地址开始,保证双字、四倍字对准。,五、数据定义,格式:变量名 操作符 操作数 ;注释 功能:为操作数分配存储单元,用变量与存储单元联系。为变量分配存储单元,并预置初值。 操作符: DB:一个操作数占有1个字节单元(8位),定义的变量为字节变量。 DW:一个操作数占有1个字单元(16位),定义的变量为字变量。 DD:一个操作数占有1个双字单元(32位),定义的变量为双字变量。 DF:一个操作数占有1个三字单元(48位),定义的变量为三字变量。 DQ:一个操作数占有1个四字单元(64位),定义的变量为四字变量。 DT:一个操作数占有1个五字单元(80位),定义的变量为五字变量。 操作数:常数、表达式、字符串、?,数据定义举例(1),ORG 200H ;设置$ DATA1 DB 12H,2+6,34H EVEN ;偶地址,使$指向偶地址 DATA2 DW 789AH ALIGN 4 ;4倍地址,使$指向4倍地址 DATA3 DD 12345678H DATA4 DW $,6699H ;$为汇编指针,16位,设置当前$(原$)的内容,吉林大学远程教育学院,微机原理及汇编语言,主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院,第 二十一 讲,数据定义举例(2),ORG 100H DATA1 DB abcd ;字符串必须用单引号 DATA2 DB AB DATA3 DW AB ;按字处理,个数只能为2,数据定义举例(3),ORG 400H DATA1 DB 1,2,?,4 ;按字节定义 DATA2 DW 5,?,6 ;按字定义 DATA3 DF ? ;按三字定义 DATA4 DB 8,数据定义举例(4),ORG 300H DATA1 DB 2 DUP (12H,34H,56H),数据定义举例(5),ORG 100H DATA1 DB 12H,34H,2 DUP (56H,3 DUP(9AH),78H),六、PROC、ENDP过程定义,功能:用于定义子程序结构,过程名是CALL的操作数。 格式: 过程名 PROC 属性 过程名 ENDP 属性:FAR,NEAR(默认值),吉林大学远程教育学院,微机原理及汇编语言,主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院,第 二十二 讲,七、模块连接伪指令,用于定义各模块之间的共享信息 1PUBLIC 格式:PUBLIC 符号1,符号2, 功能:公共引用,说明本模块定义,而其它模块引用的共享信息。 2EXTRN 格式:EXTRN 符号1:类型,符号2:类型, 功能:外部引用,说明其他模块定义,而本模块引用的共享信息。 类型: 对于变量,可以是字节(BYTE),字(WORD),双字(DWORD),三字(FWORD),四字(QWORD),五字(TWORD)。 对于标号、过程名,可以是段内引用型(FAR),段间引用型(NEAR)。 共享信息是全局变量,包括常量、变量、标号、过程名等。 EXTRN说明的信息应是在PUBLIC中已经定义的,否则出错。 例: PUBLIC VAR1, VAR2 EXTRN VAR1:WORD, VAR2:BYTE,3.4 操作数字段,操作数字段可以是寄存器、标号、变量、常数、表达式等。寄存器、标号、变量已作介绍,本节重点介绍常数、表达式。,一、常数(1),包括:数值常数、字符串常数、符号常数 1数值常数 数值常数可以是二进制数、八进制数、十进制数、十六进制数。 基数控制伪指令:改变基数默认值(原默认值为十进制)。 格式: .RADIX 数值表达式 功能:把默认的基数改变为216范围内的任何基数。 例: MOV BX, 0FFH 等价于 .RADIX 16 MOV BX, 178 MOV BX, 0FFH MOV BX,178D 2字符串常数 字符串常数:包括在单引号中的若干字符。 字符串在存储器中储存的是相应字符的ASCII码。,一、常数(2),3符号常数 包括:EQU和 (1)EQU赋值伪指令 格式:符号常数名 EQU 表达式 功能:将表达式的值赋给符号常数。 说明:表达式可以是有效的操作数格式,也可以是任何可求出数值常数的表达式,还可以是任何有效的符号(如操作符、寄存器名、变量名等)。 EQU定义的一个符号常数名在程序中只能定义一次。 例: DATA1 EQU 88 NEW_CX EQU CX DATA2 EQU DATA1+12 (2)伪指令 格式:符号常数名 表达式 功能:将表达式的值赋给符号常数。 定义的一个符号常数名在程序中可以重复定义多次。 例: DATA1 = 88 DATA1 =DATA1+99,二、表达式 (1),表达式:常数、寄存器、标号、变量与一些运算符相组合的序列。 包括:数值表达式,地址表达式。 1运算符 六种运算:算术运算、逻辑运算、移位运算、关系运算、返回值运算、属性运算。 (1)算术运算符 算术运算符:有5个,加()、减()、乘(×)、除(/)和取余(MOD)。 (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,结果为假(关系不成立),表示为0。 例: MOV AX, 2 LT 7 ; (AX)=0FFFFH,二、表达式 (3),(5)返回值运算符 返回值运算符:5个,返回变量或标号的段地址(SEG)、返回变量或标号的偏移地址(OFFSET)、返回变量或标号的类型值(TYPE)、返回变量的单元数(LENGTH)、返回变量的字节数(SIZE)。 SEG返回变量或标号的段地址运算符 格式:操作数 SEG 变量/标号 功能:将变量/标号所在段的段基址值赋给操作数。 OFFSET返回变量或标号的偏移地址运算符 格式:操作数 OFFSET 变量/标号 功能:将变量/标号所在段中的偏移值赋给操作数。 TYPE返回变量或标号的类型值运算符 格式:操作数 TYPE 变量/标号 功能:将代表变量/标号类型的值赋给操作数。 说明:如果是变量,则汇编程序将根据变量对应的数据定义伪指令回送类型值(即变量类型代表的字节数):DB为1,DW为2,DD为4,DF为6,DQ为8,DT为10。返回以字节数表示的类型,常数返回0。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为1,FAR为2。,二、表达式 (4),LENGTH返回变量的单元数运算符 格式:操作数 LENGTH 变量 功能:将代表变量的单元数赋给操作数。 说明:返回一次数据定义的第一个元素的长度,DUP时返回重复次数,其他情况返回1。 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数(按类型TYPE算),而对于其他情况,则均送1。只对DUP定义的变量有意义,返回分配给该变量的元素的个数。只返回第一个DUP前的元素个数,与DUP括号内的数据无关,认为只是一组数据而已,若与DUP并列地定义了其它数据,就只能返回1。 SIZE返回变量的字节数运算符 格式:操作数 SIZE 变量 功能:将代表变量的字节数赋给操作数。 说明:就是返回LENGTH×TYPE的结果。 汇编程序将回送分配给该变量的字节数。只对DUP定义的变量有意义。,吉林大学远程教育学院,微机原理及汇编语言,主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院,第 二十三 讲,二、表达式 (5),例: DATA SEGMENT AT 1000H ORG 3000H AA1 DW 100 DUP(0) BB1 DW 1,2 CC1 DB ABCD DD1 DW 1000 DUP(2,3) EE1 DB 50 DUP(5,6) FF1 DW 1,2,100 DUP(?) GG1 DD 5 DUP(6 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA HH1: 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, TYPE 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, 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 21H CODE ENDS END HH1,二、表达式 (7),(6)属性运算符 属性运算符:3个,临时改变类型属性运算符PTR、指定类型属性运算符THIS、定义类型属性运算符LABEL。 PTR 临时改变类型属性运算符 格式:类型 PTR 变量/标号 功能:将PTR前面的类型临时赋给变量/标号,而原有段属性和偏移属性保持不变,其本身并不分配存储单元。 说明:对于变量,可以指定类型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和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数字表达式 数字表达式:有常数、变量、标号与一些运算符相组合的序列。运算符可以是算术运算符、逻辑运算符、移位运算符、关系运算符、返回值运算符,但结果必须是常数。 3标号 标号:指令所在单元的符号地址。 标号的三种属性:段地址、偏移量、类型(NEAR、FAR)。 4变量 变量:数据所在单元的符号地址。 变量的五种属性:段地址(SEG返回值)、偏移量(OFFSET返回值)、类型(TYPE返回值)、单元数(LENGTH返回值)、字节数(SIZE返回值) 5地址表达式 地址表达式:存储器地址,即EA的计算。是常数、变量、标号与一些运算符相组合的序列。,吉林大学远程教育学院,微机原理及汇编语言,主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院,第 二十四 讲,3.5 汇编语言程序设计及举例(1),(一) 编写汇编语言程序的步骤 1. 从实际问题抽象出数学模型。 2. 确定解决此数学模型的算法。解决同一个问题可以有不同的算法。它们的效率可能有很大的差别。例如要做X*10,可以用乘法指令;也可以用X*8+X*2,而X*2或X*8也可以自身相加,或X左移来实现;这些方法的程序复杂程度和执行时间差别是很大的。又例如查表,是用线性查找还是用对分查找区别也很大。所以,确定合适的算法是很重要的。 3. 画出程序流程图。把根据算法解决问题的思路和方法,用图形表示出来。 4. 分配内存工作单元和寄存器。 5. 根据流程图编制程序。 当然,到这儿只是设计出了基本程序,此程序是否正确,可靠,还必须上机调试,排错和进行不要的检测。 (二) 判断程序质量的标准 为解决同一个问题所编制的程序,往往是多种多样的,如何衡量程序的质量呢?通常有三个标准: 1. 程序的执行时间 2. 程序所占用的内存字节数 3. 程序的语句行数 前两个标准是主要的,由于半导体存储器容量越来越大,成本急剧降低。,3.5 汇编语言程序设计及举例(2),(三) 程序流程图 在确定问题的算法以后,先不要急于写一条条指令,而要用程序流程图把编制程序的方法和思路勾画出来,确定程序的结构和相互之间的关系。本书中的流程图,采用以下一些惯用的画法。 1. 用方框表示工作框,方框中用简明的语言标明所完成的特定功能。它有一个入口一个出口,用箭头表示。 2. 用菱形表示判断框,菱形内标明比较,判断和条件。它有一个入口和几个出口,各用箭头表示。在各个出口处标明出口条件,条件成立则写“是(用Y表示)”,条件不成立用“否(用N表示)”。 3. 程序中要调用的子程序或过程,用 框表示,在框中标明子程序或过程的名字(包括入口地址、入口条件、参数、出口参数)。它有一个入口一个出口,各用箭头表示。 带箭头的直线。程序的各框之间用箭头的直线连接起来,表示程序的走向。,算术运算程序设计(直线运行程序),最简单的程序是没有分支,没有循环的直线运行程序。 在8088/8086中,数据是16位的,它只有16位的运算指令,若是两个32位的数相乘就无法直接用指令实现(在80386中有32位数相乘的指令),但可以用16位乘法指令做4次乘法,然后把部分积相加来实现。其原理如图所示。,算术运算程序设计(1),例1: 两个32位无符号数乘法程序 若数据区中已有一个缓冲区存放了32位的被乘数和乘数,保留了64位的空间以存放乘积,能实现上述运算的程序流程图如图所示,算术运算程序设计(2),相应的程序为: name 32bit mutipty data segment mulnum dw 0000,0ffffh,0000,0ffffh, 4 dup(?) data ends stack segment para stack stack db 100 dup(?) stack ends code segment assume cs:code, ds:data, ss:stack,es:data start proc far begin: push ds ;DS中包含的是程序段前缀的起始地址 mov ax, 0 push ax ;设置返回至DOS的段值和IP值 mov ax, data mov ds, ax mov es, ax ;置段寄存器初值 lea bx, mulnum mulu32: mov ax, bx ;B-AX,算术运算程序设计(3),mov si, bx+4 ;D-SI mov di, bx+6 ;C-DI mul si ;B×D mov bx+8,ax ;保存部分积I mov bx+0ah, dx mov ax.,bx+2 ;A-AX mul si ;A×D add ax,bx+0ah adc dx,0 ;部分积2的一部分与部分积1的相应部分相加 mov bx+0ah,ax mov bx+0ch,dx ;保存 mov ax, bx ;B-AX mul di ;B×C 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 ;A×C popf adc ax,bx+0ch ;与部分积4的相加部分相加 adc dx,0 mov bx+0ch,ax mov bx+0eh,dx ret start endp code ends end begin,吉林大学远程教育学院,微机原理及汇编语言,主讲人: 赵宏伟 教授 总学时: 80 吉林大学计算机科学与技术学院,第 二十五 讲,算术运算程序设计(5),例2: 32位符号数乘法 在32位无符号数乘法程序的基础上很容易实现32位带符号数的乘法。 首先设一个乘积的符号标志初值为0;检查被乘数,若为负,一方面对被乘数取补,另一方面对符号标志取反; 再检查乘数,若是负数也对乘数取补和符号标志取反;然而调用32位无符号数乘法程序。 最后检查乘积符号标志,若为负(即两个异号数相乘),则对64为乘积取补。 程序流程图如图所示。,算术运算程序设计(6),相应的程序为 name signed 32 bit mulpty data segment sign db ? mulnum dw 0X1,X2,Y1,4 dup(?) data ends stack segment para stack stack db 100 dup(?) stack ends code segment assume cs:code, ds:data, ss:stack ;以下是主过程 start proc far begin: push ds mov ax, 0 push ax ;为返回DOS设置返回地址,算术运算程序设计(7),mov ax, data mov ds, ax ;设置段寄存器初值 mov sign, 0 ;置符号为初值 lea bx, mulnum mov ax, bx ;B-AX mov dx, bx+2 ;A-DX mov si, bx+4 ;D-SI mov si, bx+6 ;C-DI cmp dx, 0 ;检验正或负 jns other ; 为正时转至OTHRE not ax not dx add ax, 1 adc dx, 0 ;负则取补 not sign ;改变符号位 mov bx, ax mov bx+2, dx ; 暂存,算术运算程序设计(8),other: cmp di, 0 ; 检查乘数符号 jns gomul ; 为正时转至GOMUL not si not di add si, 1 adc di, 0 ;为负则取补 not sign ;实现符号运算 gomul: call mulu32 ;调用32位无符号数乘法程序 cmp sign, 0 ;检查乘积的符号 je done ;乘积为正则结束 not bx+8 not bx+0ah not bx+0ch not bx+0eh add word ptr bx+8,1 add word ptr bx+0ah,0 adc word ptr bx+0ch,0 adc word ptr bx+0eh,0 ;乘积取补 done: ret start endp,算术运算程序设计(9),;以下是32位无符号数的乘法程序 mul32 proc mov ax, bx mul si mov bx+8, ax mov bx+0ah, dx mov ax, bx+2 mul si add ax, bx+0ah adc dx, 0 mov bx+0ah, ax mov bx+0ch, dx mov ax, bx mul di add ax,bx+0ah adc dx, bx+0ch mov bx+0ah,ax mov bx+0ch,dx pushf,算术运算程序设计(10),mov ax,bx+2 mul di popf adc ax,bx+0ch adc dx,0 mov bx+0ch,ax mov bx+0ch,dx ret mulu32 endp code ends end begin,分支程序设计(1),在一个实际的程序中,程序始终是直线执行的情况是不多见的,通常都会有各种分支,例如变量x的符号函数用下式表示 1 当 x0 y= 0 当 x=0 -1 当 x0 在程序中,要根据x的值给y赋值如图所示。 先把变量x从内存中取出来,执行一次“与”或“或”操作,就可以把x值的特征反映到标志位上。于是就可以判断是否等于零,若是,则令y=0;若否,再判断是否小于零,若是,则令y= -1;不是,就令y= 1。 相应的程序为:,SIGEF: MOV AX, BUFFER OR AX,AX JE ZERO JNS PLUS MOV BX, 0FFH JMP CONTI ZERO: MOV BX, 0 JMP CONTI PLUS: MOV BX, 1 CONTI:,分支程序设计(2),例1:根据AL中的被置位的情况来控制转移到8个子程序R1R8中的一个(在中断响应时,通过软件查询,从而转到相应的中断服务程序入口就类似于这种情况)。 如果AL中为 00000001 则转至R1 如果AL中为 00000010 则转至R2 如果AL中为 00000100 则转至R3 如果AL中为 00001000 则转至R4 如果AL中为 00010000 则转至R5 如果AL中为 00100000 则转至R6 如果AL中为 01000000 则转至R7 如果AL中为 10000000 则转至R8,分支程序设计(3),实现上述要求的程序框图如图所示 我们可以把8个子程序的入口地址编成如图所示的分支表。,分支程序设计(4),根据流程图可以写出下程序: NAME BRANCH_PROG DATA SEGMENT BRTAB DW R11 ;子程序R1入口地址的IP值 DW R12 ;子程序R1入口地址的码段值 DW R21 DW R22 DW R31 DW R32 DW R41 DW R42 DW R51 DW R52 DW R61 DW R62 DW R71 DW R72 DW R81 DW R82 DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?) TOP EQU $-STACK STACK ENDS,分支程序设计(5),CODE SEGMENT STACK PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX LEA BX, BRTAB ;设跳转表的地址指针 GTBIT: RCR AL, 1 JC GETAD ;顺序检查AL中各位的状态 INC BX INC BX INC BX INC BX JMP GTBIT GETAD: JMP DWORD PTR BX ;段间间接转移 STARK ENDP CODE ENDS END BEGIN,循环程序设计(1),在程序中,往往要求某一段程序重复执行多次,这时候可以利用循环程序结构。一个循环结构由以下几部分组成: 1.循环体:就是要求重复执行的程序段部分。其中又分为:循环工作部分和循环控制部分。循环控制部分每循环一次检查循环结束的条件,当满足条件时就停止循环,往下执行其他程序。 2.循环结束条件:在循环程序中必须给出循环结束的条件,否则程序就会进入死循环。常见的循环是计数循环,当循环了一定次数后就结束循环.在微型机中,常用一个内部寄存器(或寄存器对)作为计数器,通常这个计数器的初值置以循环次数,每循环一次令其减1,当计数器减为0时,就停止循环。也可以初值置0,每循环一次加1,再与循环次数相比较,若两者相等就停止循环。循环结束条件还可以有多种,下面结合例子分别介绍。 3.循环初态:用于循环过程中的工作单元,在循环开始时往往要置以初态,即分别给他们赋一个初值。循环初态又可以分成两部分,一是循环工作部分初态,另一是结束条件的初态,例如,要设地址指针,要使某些寄存器清零,或设某些标志等等。循环结束条件的初态往往置以循环次数。置初态也是循环程序重要的一部分,不注意往往容易出错。,循环程序设计(2),在循环程序中,控制循环的方法因要求不同而有若干中。 1.用计数器控制循环 这是一种最常用也是最普通的循环控制循环的方法 例1:在一串给定个数的数中寻找最大值(或最小值),放至指定的存储单元。每个数用16位表示。,NAME SEARCH_MAX DATA SEGMENT BUFFER DW X1, X2, Xn COUNT EQU $-BUFFER MAX DW ? DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB 64 DUP (?) TOP EQU $-STACK STACK ENDS CODE SEGMENT STAR

    注意事项

    本文(第3章汇编语言程序设计.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开