汇编语言程序设计实践教程.ppt_第1页
汇编语言程序设计实践教程.ppt_第2页
汇编语言程序设计实践教程.ppt_第3页
汇编语言程序设计实践教程.ppt_第4页
汇编语言程序设计实践教程.ppt_第5页
已阅读5页,还剩296页未读 继续免费阅读

下载本文档

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

文档简介

1,教材:汇编语言程序设计实践教程 欢迎提意见! 汇编语言程序设计 丁辉 电子工业出版社,后续课程: 微机接口技术及实验,是微机原理与接口技术及实验的一部分,汇编语言程序设计实践教程, 汇编语言 asm2005,2,目录,第一章 汇编语言程序设计基础 第二章 汇编语言程序设计入门 第三章 算术运算程序 第四章 代码转换程序 第五章 系统调用程序 第六章 表处理程序 第七章 子程序及其与主程序参数传递,3,1、重要性 2、特点 3、学习方法 4、考核要求,引言,4,1、重要性,专业基础课:电类、工科、理科 有助于微机应用水平提高 计算机等级考试:三级PC机技术 研究生入学考试,5,2、特点,A,B,C,概念间关系:网状,理解困难,内容多:汇编语言、微机原理、接口技术,6,3、学习方法,理解与记忆:尽快适应 预习与复习:学习效率 实验与习题:针对强 教与学,教: 难点、要点 目的:让学生少走弯路, 提高效率 学是关键,敢问! 会问!,7,4、考核要求,笔试:期末: 50% 笔试内容充分结合实验内容! 实验:预习、操作、报告,30% 平时:作业、考勤、 态度、提问: 20% 作业、实验报告必须手写!,8,第一章 汇编语言程序设计基础,1.1 二进制数和十六进制数 1.2 无符号数和带符号数 1.3 微机基本原理 1.4 8086CPU 1.5 DEBUG操作(一) 1.6 判断标志位实验 1.7 计算机中的十进制数及其运算原理 1.8 BCD码运算实验,9,1.1 二进制数和十六进制数,日常生活:十进制、十二进制、六十进制 计算机:二进制、十六进制,n位整数m位小数: Xn-1Xn-2Xn-3X2X1X0X-1X-2X-m+1X-m 数学意义: X=Xn-1En-1Xn-2En-2Xn-3En-3 X2E2X1EX0 X-1E-1X-2E-2.X-m+1E-m+1X-mE-m (0XiE-1) E=10、16、2、,10,1.1.1 二进制数,计算中:8位、16位、32位、64位、 例:1010 0101B,1001,0011,1111,0000B 书写时,每4位用空格或逗号分隔; 但源程序中不能!,加: 1011 1001 +0111 1001 10011 0010,减: 1011 1001 -0111 0110 0100 0011 不够减问题?,11,被乘数左移法 10111001 01111001 10111001 10111001 10111001 10111001 +10111001 0101011101110001,二进制数乘法运算,12,二进制数除法运算,除数右移法 0000000100110100 100110101011100101011010 -10011010 11111010 -10011010 11000001 -10011010 10011110 -10011010 010010,加减乘除 人工计算方法 硬件方法 编程方法 有小数点?,13,1.1.2 十六进制数,源程序中采用,实际上也是二进制 4位二进制=1位十六进制,09、AF 例:0ABH=1010 1011B,0=0000B 8=1000B 1=0001B 9=1001B 2=0010B A=1010B 3=0011B B=1011B 4=0100B C=1100B 5=0101B D=1101B 6=0110B E=1110B 7=0111B F=1111B 必须熟记!,加减:参照二/十进制 列竖式 乘除:转换为二进制 用二进制运算 转换为十六进制,14,1.1.3 十进制与二/十六进制转换,十进制二进制 整数部分:除2取余法(已知X求Xn-1,X2X1X0) 小数部分:乘2取整法(已知X求X-1X-2X1-mX-m),十进制十六进制: 1、先二进制,再十六进制 2、整数部分:除16取余法 小数部分:乘16取整法,二进制/十六进制十进制: (已知Xn-1,X2X1X0 X-1X-2X1-mX-m求X) 整数小数部分:按幂展开,15,十进制转二进制举例,整数:除2取余 100 500 =B0 250 =B1 121 =B2 60 =B3 30 =B4 11 =B5 01 =B6 100=0110 0100B,小数:乘2取整 0.568 B-1=1.136 B-2=0.272 B-3=0.544 B-4=1.088 B-5=0.176 B-6=0.352 B-7=0.704 B-8=1.408 0.568=0.1001 0001B 可能无法完全精确转换,1.2 无符号数和带符号数,计算机中同一个数可表示不同的实际值 同一个实际值在计算机中有不同形式表示 机器数:计算机中的二进制, 十六进制 真值:机器数所表示的实际数值,十进制,机器数:无符号数、带符号数 带符号数:原码、反码、补码 属于定点数,整数是定点数的特例 计算机中数的表示和计算还有浮点数,17,1.2.1 无符号数,8位、16位、32位、, 每位都是数值位 8位:0000 0000B1111 1111B 0 255 16位:0000H0FFFFH 0 65535,18,1.2.2 带符号数、原码,8位、16位、32位、, 最高位是符号位,0=正,1=负 其余每位都是数值位 原码:低7位是表示绝对值 1111 1111B 0FFH -127 1000 0000B 80H -0 0000 0000B 00H +0 0111 1111B 7FH +127,19,反码,正数:与原码相同; 负数:对应正数的原码每位取反 1000 0000B 80H -127 1111 1111B 0FFH -0 0000 0000B 00H +0 0111 1111B 7FH +127,20,补码,正数:与原码相同; 负数:对应正数的原码每位取反+1, (反码+1) 1000 0000B 80H -128 1111 1111B 0FFH -1 0000 0000B 00H 0 0111 1111B 7FH +127,21,8位机器数与真值关系图,00H,7FH,80H,FFH,真值,机器数,-128,127,255,-1,-127,无原反补,无,原,补,反,0,128,模:28,22,1.2.3 真值与机器数转换,人工计算:真值转换为机器数; 机器转换为真值。 从机器数的定义分析, 分三种情况讨论: 1.无符号数与真值的转换 2.正数真值与原码、反码、补码转换 3.负数真值与原码、反码、补码转换,23,1.无符号数与真值转换,真值无符号机器数: 除2取余法,不足的位数补0 例:2001100 1000B0C8H 无符号机器数真值: 按幂展开, 例:1101 0000B(0D0H) 128+64+16=208,24,2.正数真值与原反补转换,与无符号差别仅最高位必须=0, 转换方法与无符号数的方法相同。 正数真值原、反、补码机器数: 除2取余法,结果最高位必须为0! 例: 1200111 1000B78H 原、反、补码机器数真值: 按幂展开, 例:0110 1010B(6AH) 64+32+8+2=106,25,3.负数真值与原反补转换,真值机器数:先转为原码反码补码。 负数真值原码:将绝对值除2取余,最高位写1 负数真值反码:原码数值位取反,符号位不变 负数真值补码:在反码最低位上加1 例:-1201111 1000B1000 0111B1000 1000B 机器数真值:机器数的最高位为1 原码真值:数值位按幂展开,加负号 反码真值:数值位每位取反后按幂展开,加负号 补码真值:数值位取反加1,按幂展开,加负号 对任意二进制数B,等式/(B-1)=/B+1成立. 例:C8-72(原码)-56(反码)-57(补码),26,1.2.4 机器数和真值关系,同一个真值有不同的机器数表示:,同一个机器数可以表示不同的真值:,27,1.2.5 为什么用补码,1. 减法转换为加法:A-B=A+(-B) 2. 更重要的原因是: 带符号数和无符号数的加减运算规则相同, 可简化CPU硬件。,求补码:真值转换为机器数, 正数:十进制转为二进制 负数:对应正数的二进制取反加1 求补:取反加1;正转为负,负转为正 对任意二进制数B: 0-B=2n-B=/(B-1)=/B1,28,1.3 微机基本原理,微机基本组成结构 指令执行过程,29,1.3.1 微机基本结构框图,CPU,存储器,I/O接口,I/O设备,AB 地址总线,数据总线 DB,控制总线 CB,三条总线连接三大部件,AB位数决定存储容量,DB位数决定一次传送数据位数 控制总线主要有:M/IO、/RD(读)、/WR(写),数字电子计算机,30,1.3.2 指令执行过程,冯诺依曼型计算机:存储程序计算机,一条指令的执行过程分4个步骤: 取指、取数、译码操作(运算)、存数 指令的执行时间问题,程序装入主存,运行,控制权交回系统。,高级语言程序由有序排列的语句组成; 汇编语言程序由有序排列的指令组成。 程序的运行过程就是指令执行的重复过程,31,取指、取数过程,AB送出地址; CB送出M/IO、/RD; 存储器从DB送 机器码或数据; CPU从DB上读入。,CPU,存储器,I/O接口,AB,DB,CB,32,存数过程,I/O接口的操作:输入、输出 原理与存储器读、写相同,AB送出地址; DB送出数据; CB送出M/IO、/WR; 存储器从DB读入数据,CPU,存储器,I/O接口,AB,DB,CB,33,1.4 8086CPU,CPU是微机的核心,最关键的部件。 重点掌握: 与汇编语言编程密切相关的内容 内部寄存器及其用法 标志寄存器,34,1.4.1 微处理器概述,8位:8080、8085、8088 Intel 80x86系列:向上兼容 16位:8086、(80186)、80286 32位:80386、80486、Pentium、,微控制器(单片机) 控制应用 MCS51、PIC 8位为主 DSP芯片 信号处理 TMS320 16位为主 嵌入式微处理器 移动设备 ARM 32位为主 通用微处理器 台式微机 Z80、80X86 32位为主,CPU微处理器,应用不同有4个分支:,35,1.4.2 8086内部结构,寄存器组,段寄存器 指令指针,总线控制逻辑,指令队列,总线接口单元BIU,执行单元EU,标志寄存器,ALU,外部总线,内部总线,地址加法器,控制单元,20位地址,16位数据,元件级、门电路级、框图级,前后联系理解!,36,1.4.3 8086寄存器,AX 累加器 Accumulator,BX 基址寄存器 Base,CX 计数寄存器 Count,DX 数据寄存器 Data,源变址寄存器 Source Index,目的变址寄存器 Destination Index,基址指针 Base Pointer,堆栈指针 Stack Pointer,代码段寄存器 Code Segment,数据段寄存器 Data Segment,堆栈段寄存器 Stack Segment,扩展段寄存器 Extra Segment,指令指针 Instruction Pointer,标志寄存器,数据寄存器,变址,指针,通用寄存器,段寄存器,32位: EAX EBX ECX EDX ESI EDI EBP ESP EIP EFLAGS 段寄存器 FS GS,16位 8位 8位,PC程序计数器,控制寄存器,37,1.4.4 标志寄存器,1,0,条件标志:6个,在运算器中 控制标志:3个,控制电路中,IF:中断允许标志,CPU可屏蔽中断用 DF:方向标志,串操作指令用 TF:跟踪(单步、陷井)标志,调试程序用,在调试软件DEBUG中用2个字母表示,38,条件标志(1),PF:奇偶标志,用于传送数据时的校验 计算结果的低8位1的个数为偶数,则PF=1 否则,PF=0,ZF:零标志,用于减运算时判断相等 逻辑运算时判断全0 计算结果为0,则ZF=1; 不为0,则ZF=0,AF:辅助进位/借位标志,用于BCD码计算 加运算时D3位向D4位有进位 或减运算时D3位向D4位有借位,则AF=1 否则AF=0,39,条件标志(2),CF:进位/借位标志, 用于无符号数加/减运算, 多字节运算的进位/借位传递 计算时最高位有进位/借位,则CF=1 否则CF=0,SF:符号标志,用于带符号数运算 计算结束为负则SF=1,为正则SF=0,OF:溢出标志,用于带符号数运算 计算结果超出带符号数的表示范围,则OF=1 否则OF=0 8位:-128127;16位:-3276832767,CF,CF,40,标志位判断举例(加),1111,0100 +1111,0100 - 1,1110,1000,-12 +)-12 - -24,244 +244 - 488=232+256,PF=1,ZF=0,AF=0,CF=1,SF=1,OF=0,1110,1000=-24,1110,1000=232,CPU运算:,分析: 带符号: 无符号:,带符号数的符号位也当成数值位参加计算!,41,标志位判断举例(减),1111,0100 - 0000,1100 - 0,1110,1000,-12 -)+12 - -24,244 - 12 - 232,PF=1,ZF=0,AF=1,CF=0,SF=1,OF=0,1110,1000=-24,1110,1000=232,CPU运算:,分析: 带符号: 无符号:,特别注意区别CF和OF!,42,CF、OF判断举例,CF=0,SF=1,OF=1,1110,1000=-24,1110,1000=232,CPU运算:,0111,0100 +0111,0100 - 0,1110,1000,+116 +)+116 - +232,116 +116 - 232,分析: 带符号: 无符号:,计算机中无符号数和带符号数的运算问题,43,理解机器数运算问题,标志位是加减计算结果的一部分 无符号数运算看CF,带符号数运算看SF、OF 编程者知道是带符号数还是无符号数 CPU不知道是带符号数还是无符号数 两种情况要各算一遍,提供结果给编程者 按前例的分析,带符号数若用补码表示, 实际上只算一遍,硬件只有一套 这是带符号数用补码表示的根本原因!,44,1.4.5 判断OF三方法,OF标志最复杂、最重要, 理解带符号及其计算。(难点) 三种方法,等效 人工判断、计算机判断 以加法为例,减法同理可推,45,1.按OF定义判断,被加数、加数转为真值后相加, 再用真值的和判断。-128127;-3276832767 这是人工的方法,计算机中不可能用! 前面3个例子都是用了这种方法 缺点:计算过程麻烦,容易出错,46,2.按符号位判断,被加数、加数的符号、和的符号: 正+正=正:OF=0;正+正=负:OF=1 负+负=负:OF=0;负+负=正:OF=1 正+负=正,负:OF=0 前面的例子用这种方法判断结果一样 这是人工的方法,看似繁琐,实际最简单 计算机中也可用,但硬件不够简化!,47,OF的数学意义,0 00H,40H 64,80H -128,-64 C0H,7FH 127,-1 FFH,机器数:00H40H7FH80HC0HFFH00H 0 64 127 -128 -64 -1 0,左半圆正数, 右半圆负数。 因为ALU位数有限, 计算机8位+8位=8位 两个数相加实际上: 从一个点顺时针走 到另一个点。,48,最高位、次高位的进位: 都有或都没有进位,则OF=0 一个有一个没有, OF=1 前面的例子用这种方法判断结果一样 关键是理解符号位的特殊性 是CPU中硬件采用的方法,人工也可采用。 也可转化为双符号位法。, 1,1111,0100 +1,1111,0100 1,1110,1000,3.按最高次高位进位判断,49,1.4.6 标志位小结,人工判断标志位是为了掌握其原理, 程序运行时标志位是由硬件自动判断的, 编程的任务是根据这些标志位做不同的处理。 充分利用标志位编出高水平算法是 汇编语言程序设计的重要技巧。 不同CPU标志位不同,但原理完全相同! 标志位是一切逻辑推理的基础! 现代CPU增加了很多控制标志位, 但条件标志位数量没增加,没有新的概念和原理,50,1.5 DEBUG操作(一),系统的内部命令,不必复制或安装。 主要功能: 显示修改寄存器值,显示修改内存单元内容 单步运行程序,断点运行程序 显示程序,修改部分指令 命令: 一个字母,后跟参数 P18表1.8 通过实验熟练掌握!,51,1.6 判断标志位实验,预习:人工计算和判断标志位; 用ADD AL,BL,8位加,标志位; 用SUB AL,BL,8位减,标志位。 16位加减,判断CF、SF、OF 思考题前3题必做。,52,1.7 BCD码及计算,计算机只能用二进制 对十进制: 十进制二进制,计算后十进制 有否更简单的方法表示和计算十进制数? 计算机如何表示十进制数?BCD码 计算机如何计算十进制数?计算后调整,53,1.7.1 BCD码,二进制编码的十进制数 真值98 压缩型 1001 1000B=98H 非压缩型 0000 1001 0000 1000B =0908H 比较:用无/带符号二进制表示=62H 机器数98H表示的真值: 无符号数152,带符号(补码)数-104 压缩型BCD码98,0=0000B 1=0001B 2=0010B 3=0011B 4=0100B 5=0101B 6=0110B 7=0111B 8=1000B 9=1001B P3表1.2,54,1.7.2 BCD码的运算,加:先按二进制加(ADD),再调整(DAA、AAA) 减:先按二进制减(SUB),再调整(DAS、AAS) 乘:先按二进制乘(MUL),再调整(AAM) 除:先调整(AAD),再按二进制除(DIV) 调整指令共有6条,见P23表1.12 分别与相应的二进制运算指令配合, 两条指令执行的总效果是: 对BCD码运算,得的结果也是BCD码.,55,BCD码加举例,DAA 压缩型BCD码加调整 AAA 非压缩型BCD码加调整 跟在以AL为目的的ADD/ADC指令之后 AL=45H,BL=67H;必须是压缩型BCD码 ADD AL,BL ;AL=0ACH,CF=0,AF=0 DAA ;AL=12H, CF=1,AF=1 AL=05H,BL=05H;必须是非压缩型BCD码 ADD AL,BL ;AL=0AH,CF=0,AF=0 AAA ;AL=00H,CF=1,AF=1,56,BCD码减举例,DAS 压缩型BCD码减调整 AAS 非压缩型BCD码减调整 跟在以AL为目的的SUB/SBB指令之后 AL=47H,BL=65H;必须是压缩型BCD码 SUB AL,BL ;AL=0E2H,CF=1,AF=0 DAS ;AL=82H, CF=1,AF=0 AL=05H,BL=09H;必须是非压缩型BCD码 SUB AL,BL ;AL=0FCH,CF=1,AF=1 AAS ;AL=06H, CF=1,AF=1,57,BCD码乘除举例,AAM 非压缩型BCD码乘调整,跟在8位MUL之后 AAD 非压缩型BCD码除调整, 放在16位除8位的DIV指令之前 AL=05H,BL=09H;必须是非压缩型BCD码 MUL BL ;AH=00H,AL=2DH AAM ;AH=04H,AL=05H AH=05H,AL=02H,BL=06H;必须是非压缩型BCD码 AAD ;AH=00H,AL=34H DIV BL ;AL=08H,AH=04H,58,1.8 BCD码运算实验,预习:人工计算,DAA、AAM、AAD 用ADD AL,BL,DAA,二进制加,BCD码加 用MUL BL,AAM, 二进制乘,BCD码乘 用AAD,DIV BL, BCD码除 AAA、DAS、AAS的验证 思考题:带符号BCD码?,59,第二章 汇编语言程序设计入门,2.1 寻址方式 2.2 数据传送指令 2.3 汇编语言源程序结构 2.4 汇编语言程序上机过程 2.5 指令错误分析及寻址方式实验,60,2.1 寻址方式,指令由操作码和操作数两部分组成,寻址方式:如何指定操作数 ADD AL,BX,操作数组合三种情况: 双操作数、单操作数、无操作数(隐含) 双:目的操作数,源操作数,操作数存放的三个位置: CPU中、存储器中、I/0接口中,两种性质的操作数: 用来运算的数据、转移的目的地址,61,2.1.1 隐含寻址,指令只有操作码,没指定操作数, 根据操作码就可以确定相应的操作数. 例:BCD码运算调整指令, 乘法、除法指令的其中一个操作数,62,2.1.2 立即寻址,指令中直接给操作数,立即(数)寻址 用data表示, 8位或16位 例:ADD AL,50H ADD AL,CNT ;CNT是符号常量 执行过程不需取数的时间 只能用在源操作数,63,2.1.3 寄存器寻址,指令中给出寄存器名称,其内容是操作数 用reg表示, AX,BX,CX,DX,SI,DI,BP,SP AH,AL,BH,BL,CH,CL,DH,DL 例:ADD AL,BL 机器码中寄存器编号用3位编码, 字或字节用1位编码。,64,2.1.4 段寄存器寻址,指令中给出段寄存器名称,其内容是操作数 用segreg表示,DS、ES、SS、CS 例:MOV DS,AX 机器码中段寄存器编号用2位编码, 只有MOV,PUSH,POP指令可用此寻址方式,65,2.1.5 I/O端口寻址,操作数在I/O接口电路中,仅IN,OUT指令 直接I/O端口寻址:用port表示,8位 间接I/O端口寻址:用DX表示,16位 例:IN AL,50H ;50H不是立即寻址! OUT DX,AL ;DX不是寄存器寻址! 端口=存储单元,端口号=存储单元地址,66,2.1.6 转移地址寻址,转移类指令中用 直接转移:用标号直接指定目的地址 间接转移:用寄存器/内存内容指定目的地址 段内:目的地址与转移指令在同一段中 段间:目的地址与转移指令不在同一段中 例:JMP NEXT ;NEXT是一个标号 JMP BX ;BX的内容是目的地址,67,2.1.7 存储器操作数寻址,操作数在存储器中,指令中指定其地址 是用得最多,最灵活的一种寻址方式 物理地址20位,逻辑地址16位 物理地址=段地址10H+偏移地址 例:16661H=1234H10H+4321H 用mem表示偏移地址,BX,BP,SI,DI,方括号 段地址固定搭配,DS,SS(,ES,CS) 段首址=段地址10H,能被16整除,12340H + 4321H 16661H,实地址模式 保护模式 虚拟86模式,68,1. 直接寻址,用变量名指定操作数的地址 例:ADD AL,Xval ;方括号可省略 Xval是变量名,注意与立即寻址的区别! ADD AL,20H,20H会被汇编成立即数 段地址固定搭配DS, 偏移地址也称为有效地址EA 物理地址=DS10H+EA DS:EA,69,2. 寄存器间接寻址,用一16位寄存器指定操作数地址 BX、SI、DI、BP之一 BX、SI、DI搭配DS;BP搭配SS DS:BX/SI/DI,或SS:BP 例:ADD AL,BP ADD SI,AX,70,3. 寄存器相对寻址,一16位寄存器加位移量指定操作数地址 BX、SI、DI、BP之一; 位移量为8位或16位带符号数,D8、D16。 BX、SI、DI搭配DS;BP搭配SS 例:ADD AL,BP+5 若用SI、DI也称为变址寻址; 若用BX、BP也称为基址寻址。,71,4. 基址变址寻址,基址寄存器加变址寄存器指定操作数地址 基址:BX、BP之一;变址:SI、DI之一 BX搭配DS;BP搭配SS DS:BX+SI/DI,SS:BP+SI/DI 例:ADD AL,BP+SI,72,5. 相对基址变址寻址,基址加变址加位移量指定操作数地址 基址:BX、BP之一;变址:SI、DI之一 位移量为8位或16位带符号数,D8、D16。 BX搭配DS;BP搭配SS DS:BX+SI/DI+D8/D16 SS:BP+SI/DI+D8/D16 例:ADD AL,BP+SI-5,73,6. 存储器操作数使用,共5种,物理地址由地址加法器自动计算 段替换,例:DS:BP、ES:BX 多字节:低地址低字节,高地址高字节 最低字节的地址就是多字节数的地址 规则字:从偶地址开始存放,一个总线周期 非规则字:从奇地址开始存放,两个总线周期 数组操作:首地址,前一元素、后一元素 等效写法:BUF+BX+SI、BUFBXSI BUFBX+SI 双操作数不能同为存储器操作数 寻址方式越复杂,则执行时间越长,74,2.2 数据传送指令,每条指令都要了解六个方面的内容:,掌握: 1、基本功能用途 2、寻址方式组合 3、对标志位影响,有影响 无影响 不确定,一般了解: 4、执行时间 5、字节数 6、机器码格式,指令系统分六大类指令:,1、数据传送 2、算术运算 3、逻辑运算和移位,4、程序流程控制 5、串操作 6、CPU控制,75,2.2.1 通用数据传送指令,MOV dst,src;复制:目的源 合法寻址方式组合分为四种情况: reg/mem,data reg,mem mem,reg reg,reg segreg,reg/mem reg/mem,segreg 其它双操作数与这4种组合比较,使用最频繁指令 data不能为目的 字节/字类型必须匹配 MOV BYTE PTRBX,20H CS不能为目的 IP源目的都不行,76,2.2.2 交换指令,XCHG dst,src;dstsrc, 操作数组合: MOV指令4种中的两种,即: reg,mem mem,reg reg,reg,77,2.2.3 堆栈操作指令,堆栈:FILO(先进后出)的存储区域 入栈:PUSH src;SPSP-2,SS:SPsrc 出栈:POP dst;dstSS:SP,SPSP+2 src、dst=reg16、mem16、 segreg,(POP CS除外),78,堆栈操作举例,设: SS=5430H SP=0020H AX=1234H BX=5678H 执行:PUSH AX PUSH BX POP AX POP BX 结果:AX=5678H BX=1234H,顶,底,SP=20H,SP=1EH,SP=1CH,79,2.2.4 查表指令,也称为换码指令,表格最大256字节 XLAT ;AL DS:BX+AL XLAT src_table src_table是表格首地址的变量名,可省略 缺省段寄存器是DS,可以段替换 特殊的寻址方式,或隐含寻址 累加器专用指令,80,2.2.5 输入输出指令,累加专用指令 唯一能对I/O接口中操作数操作的指令 与MOV指令原理一样,81,2.2.6 地址传送指令,1、有效地址传送指令 LEA reg16,mem;reg16 mem的偏移地址 例:LEA BX,Xval等效于MOV BX,offset Xval LEA SI,BX+DI;SI BX+DI,2、地址指针传送指令 LDS reg16,mem32;reg16 mem32 DS mem32+2 LES reg16,mem32; reg16 mem32 ES mem32+2,82,2.2.7 标志位传送指令,隐含寻址,唯一对FLAGS操作的指令 取标志:LAHF ; AH FLAGS低8位 置标志:SAHF ; FLAGS低8位AH 标志入栈:PUSHF ; SPSP-2,SS:SPFLAGS 标志出栈:POPF ;FLAGSSS:SP,SPSP+2,83,2.2.8 数据传送指令对标志位的影响,POPF、SAHF对标志位有影响 其余数据传送指令均对标志位无影响,理解数据传送指令与总线信号关系: M/IO、/RD、/WR MOV AL,BX;M,/RD MOV BX,AL;M,/WR IN AL,DX; IO,/RD OUT DX,AL; IO,/WR,84,2.3 汇编语言源程序结构,分段结构 伪指令 段名 标号 宏名,DATA SEGMENT 定义变量 DATA ENDS EXTRA SEGMENT 定义变量 EXTRA ENDS STACK SEGMENT 定义堆栈 STACK ENDS MAC1 MACRO 宏定义体 ENDM,CODE SEGMENT ASSUME CS:CODE,DS:DATA ES:EXTRA,SS:STACK START:;段寄存器初始化 CALL SUB1 MAC1 ;宏调用 MOV AH,4CH ;返回DOS INT 21H SUB1 PROC RET SUB1 ENDP CODE ENDS END START,85,2.3.1 分段结构,一般分4个段,SEGMENT、ENDS 数据段、扩展段、堆栈段:定义数据 代码段:ASSUME确定各段的性质 起始地址定义标号,最后END START 段寄存器赋初值,CS除外 MOV AH,4CH/INT 21H返回系统 宏定义MACRO/ENDM,宏调用 子程序(过程),PROC/ENDP一般放在主程序后 程序的层次结构用锯齿状表示,86,2.3.2 语句格式,三种语句: 指令语句:汇编时能生成机器码 伪指令语句(指示性语句):提供汇编、链接信息 宏指令语句 语句格式: 标号: 操作码 目的操作数,源操作数;注释 变量 伪操作 操作数,操作数;注释 标号: 宏指令名 实际参数;注释,87,2.3.3 变量和标号,标识符:变量、标号、符号常量、段名、过程名、宏名 保留字:指令操作码、伪指令操作码、寄存器名等 大小写不敏感 标号只能在代码段中定义,变量可在任何段中定义 变量和标号的三种属性:段地址、偏移地址、类型 变量类型:BYTE、WORD、DWORD等 标号类型:NEAR、FAR 指令伪指令中,当变量、标号当操作数用 变量汇编成直接寻址或相对寻址 标号在跳转指令中用,直接寻址,88,2.3.4 操作数、表达式和操作符,操作数:寄存器、变量、标号、常量、表达式 表达式:用操作符连接变量、寄存器、常量等 汇编时对表达式进行计算, 数值表达式:立即数、位移量、常数的位置 地址表达式:存储器操作数的位置 操作符:算术、逻辑、关系、分析、属性,89,操作符,算术:+、-、*、/、MOD 地址常数 ,同一段中的地址1-地址2 逻辑:NOT、AND、OR、XOR、SHR、SHL 只能对数值操作,不能对地址操作 关系:EQ、NE、GT、LT、GE、LE,假=0,真=FF或FFFF 同一段中的两地址可比较,比地址不是比内容 分析:SEG、OFFSET、 TYPE、 LENGTH、 SIZE 段, 偏移地址 类型 * 个数 = 总字节数 变量:1,2,4 标号:-1,-2 属性:HIGH、 LOW、 SHORT、PTR、 THIS、 段操作符 高字节,低字节,短, 变类型,变类型,段替换 自行实验试用!以后陆续会有一些应用的例子。,90,2.3.5 常用伪指令,定义符号,也称表达值赋值伪指令: 名称 EQU 表达式 ;不可重新定义 名称=表达式 ;可重新定义 方便程序修改,使用常数、表达式意义清晰。 数据定义:按地址顺序存入各段 变量 伪操作符 表达式,表达式, 变量 伪操作符 重复次数 DUP(表达式,) DB(字节)、DW(字)、DD(双字)、DQ(8)、DT(10) DW可定义偏移地址,DD可定义段地址和偏移地址 可用?表示一个未置初值的数据,91,汇编语言程序设计方法,(1)分析问题,明确要求 (2)建立数学模型 (3)确定算法和处理方案 (4)画流程图 (5)编制程序:划分模块,分配寄存器、存储单元 (6)上机调试(含汇编连接):模块调试、整体调试 (7)试运行和分析结果 (8)整理文档,交付使用 强调:程序调试的重点性!,上机,92,2.4 上机过程,1、编辑:EDIT 文件名.ASM 2、汇编:MASM 文件名; 用.ASM(源文件)生成.OBJ(目标文件), 也可生成.LST(列表)、.CRF(交叉引用) 3、连接:LINK 文件名; 用.OBJ文件生成.EXE(可执行文件) 也可生成.MAP(存储映象), 还可使用.LIB(库文件) 4、调试:DEBUG 文件名.EXE 按每个模块(子程序)的输入输出关系检查 最关键的一步,花费最多时间。,93,2.5 指令错误分析及寻址方式实验,预习:1.判断指令错误类型; 2.伪指令数据分配,指令执行结果 必做:1.编辑,汇编:读懂错误信息! 2.完整程序,观察数据如何存储, 各种寻址方式执行结果。 选做:1.生成并观察LST、CRF、MAP文件 2.对LEA、LDS、LES指令验证 3.验证各指令对标志位的影响情况 4.验证各种操作符 思考:1.以后指令有错必须搞清,不得重犯! 2.以后指令格式、功能之惑都可验证! 验证也是一种学习过程!,94,寻址方式实验程序(1),DATA SEGMENT A1 DW 1234H A2 DB -1,0ABH DW -5 A3 DB 56,56H,“AB cd$” DATA ENDS EXTRA SEGMENT B1 DB 1,2,3,4 B3 EQU THIS BYTE B2 DW A2 DD A3 DB (A3-A2)/2 DB $-B1 DB LENGTH BTM EXTRA ENDS,STACK SEGMENT BTM DW 16 DUP(?) STACK ENDS,95,寻址方式实验程序(2),CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AX,STACK MOV SS,AX MOV SP,SIZE BTM,96,寻址方式实验程序(3),MOV AX,A1+3 ;分析:AH=_,AL=_,验证:AH=_,AL=_ MOV AX,B2 ;分析:AH=_,AL=_,验证:AH=_,AL=_ MOV BP,OFFSET A1 MOV AX,BP ;分析:AH=_,AL=_,验证:AH=_,AL=_ MOV AX,DS:BP ;分析:AH=_,AL=_,验证:AH=_,AL=_ MOV AX,ES:BP ;分析:AH=_,AL=_,验证:AH=_,AL=_ MOV BX,OFFSET A1 MOV AX,BX+3 ;分析:AH=_,AL=_,验证:AH=_,AL=_ MOV AX,ES:BX+3 ;分析:AH=_,AL=_,验证:AH=_,AL=_ PUSH AX ;分析:SP=_,SS:SP=_,验证:SP=_,SS:SP=_ PUSH BX ;分析:SP=_,SS:SP=_,验证:SP=_,SS:SP=_ POP AX ;分析:SP=_,AX=_,验证:SP=_,AX=_ POP BX ;分析:SP=_,BX=_,验证:SP=_,BX=_ MOV BX,OFFSET B2 MOV AL,6 XLAT ;分析:AL=_,验证:AL=_ XLAT B3 ;分析:AL=_,验证:AL=_,97,第三章 算术运算程序(引言),程序结构:顺序、分支、循环、子程序 用:无条件跳转指令、条件跳转指令 程序功能:算术运算、代码转换、系统调用、 表处理、子程序参数传递 编程方法:分配寄存器、存储单元, 本书有丰富的实用的实例, 理解、掌握编程技巧。 程序调试:检查程序的正确性的过程, 必不可少的一步!最重要的一步!,98,3.1 跳转指令 3.2 算术运算指令 3.3 多字节加/减运算程序 3.4 多字节加/减程序实验 3.5 多字节除法运算程序 3.6 多字节除法程序实验 3.7 多字节乘法运算程序 3.8 多字节乘法程序实验,第三章 算术运算程序(目录),加 减 乘 除 N! 平方 开平方 二进制 BCD码,99,3.1 跳转指令,实现分支结构和循环结构 分:无条件跳转、条件跳转、循环控制 对标志位均不影响 基本功能:修改IP、CS,100,段内直接跳转:JMP near_label ;IPIP+D16 段内短跳转: JMP SHORT short_label ;IPIP+D8 段间直接跳转:JMP far_label ;IP标号的偏移地址 CS标号的段地址 相当于高级语言的GOTO语句,3.1.1 无条件跳转指令,段内间接跳转:JMP reg16/mem16 ;IPreg16/mem16 例:JMP BX JMP BX 段间间接跳转:JMP mem32 ;IPmem32、mem32+1 CSmem32+2、mem32+3,101,直接跳转指令举例,CODE SEGMENT ASSUME CS:CODE START: JMP START ;短 JMP EXIT ;内 JMP EXIT1 JMP SHORT EXIT JMP NEAR PTR EXIT JMP FAR PTR EXIT ;间 JMP FAR PTR EXIT2 EXIT: MOV AH,4CH INT 21H,ORG 200H EXIT1: MOV AH,4CH INT 21H CODE ENDS CODE1 SEGMENT ASSUME CS:CODE1 EXIT2: MOV AH,4CH INT 21H CODE1 ENDS END START,102,直接跳转指令机器码,如何察看偏移地址200H开始的指令及CODE1段?,103,间接跳转指令举例,段内间接跳转: 设:BX=1234H,DS=1000H,(11234H)=5678H, 若:执行JMP BX, 则IP=1234H,即目的地址为1234H; 若:执行JMP BX,则IP=5678H,即目的地址为5678H。,段间间接跳转: 设:BX=1234H,DS=1000H, (11234H)=5678H,(11236H)=9ABCH, 若:执行JMP BX,则IP=5678H,CS=9ABCH, 即程序跳到段地址为9ABCH,偏移地址为5678H的 地址处继续执行。,104,一般格式:Jccc short_label;条件成立则跳,否则顺序执行 要跟在影响标志位的指令之后。 D8=-128127。 相当于高级语言中的IF THEN ELSE结构,3.1.2 条件跳转指令,多分支结构要用多条条件跳转指令组合实现。,105,JC short_label;CF=1,则跳=JB/JNAE JNC short_label;CF=0,则跳=JNB/JAE JZ short_label;ZF=1,则跳=JE JNZ short_label;ZF=0,则跳=JNE JS short_label;SF=1,则跳 JNS short_label;SF=0,则跳 JO short_label;OF=1,则跳 JNO short_label;OF=0,则跳 JP short_label;PF=1,则跳=JPE JNP short_label;PF=0,则跳=JPO 无AF的条件跳转指令。,单个标志位的条件跳转指令,106,LOOP short_label;CXCX-1,若CX0则跳转 LOOPZ short_label;CXCX-1,若CX0且ZF=1则跳转 LOOPE short_label; LOOPNZ short_label;CXCX-1,若CX0且ZF=0则跳转 LOOPNE short_label; JCXZ short_label;若CX=0则跳转,3.1.3 循环控制指令,相当于高级语言的DO UNTIL结构。,107,循环指令原理,控制循环结束的条件:计数、条件; 要注意循环结束条件设置,不能死循环, 双重循环:不能交叉,结束条件完全无关。,108,3.2 算术运算指令,二进制、BCD码: 加、减、乘、除 3.2.1 二进制运算指令 3.2.2 BCD码调整指令,109,一般加/减 ADD dst,src; dstdst+src SUB dst,src ;dstdst-src,带CF加/减:实际上涉及两个CF! ADC dst,src;dstdst+src+CF SBB dst,src;dstdst-src-CF,比较 CMP dst,src;dst-src,寻址方式组合: 对6个条件标志位均有影响,3.2.1 二进制运算指令 加/减指令,110,2、判断两数大小: 无符号:CF=0,则dstsrc;CF=1,则dstsrc 带符号: 正-负=正:SF=0,OF=0 ; 正-正=正:SF=0,OF=0 负:SF=1,OF=1; 负:SF=1,OF=0 负-正=负:SF=1,OF=0 ; 负-负=负:SF=1,OF=0 正:SF=0,OF=1; 正:SF=0,OF=0 OF、SF相同,则dstsrc;OF、SF不同则dstsrc OF SF=0, 则dsts

温馨提示

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

评论

0/150

提交评论