《微机原理及应用重点集锦.pdf》由会员分享,可在线阅读,更多相关《微机原理及应用重点集锦.pdf(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、内部资料,转载请注明出处,谢谢合作。第一章:计算机概述及基础知识一、计算机中常用的半导体存储器类型和缩写:1、只读存储器 ROM:(Read Only Memory)2、一次性可编程只读存储器PROM(Programmable ROM)3、随机存取存储器:RAM(Random Access Memory)4、静态 RAM:SRAM(Static RAM)5、动态 RAM:DRAM(Dyanmic RAM)6、光可擦除电可编程只读存储器EPROM(Erasable Programmable ROM)7、电擦除电可编程只读存储器EEPROM(Electrically ErasableProgram
2、mable ROM)8、闪烁存储器Flash Memory二、常用存储器容量单位及表示方法:1 字节=8位二进制数,1字=2字节=16位二进制数,双字=4字节=32位二进制数1KB=1O24B(字节)1MB=1O24KB1GB=1O24MB 1TB=1O24GB1节=16字节 1 页=256字节 1段=64KB(字节)三、存储器中常用的术语、概念和含义:1、存储器的物理地址:使 用 CHJ全部地址线对存储器进行的编址,称为存储器的物理地址或绝对地址。(使用CRJ全部寻址范围内的地址码对存储单元进行的编址称为存储器的物理地址或绝对地址。)2.存储器的逻辑地址:由 CPU内部段寄存器即段基址)和偏
3、移地址寄存器 例 如:SL DL B R 和 SP等寄存器)的当前值所构成的地址称为逻辑地址。入一个存储单元的物理绝对)地址是唯一的,但可以有多个逻辑地址!或:一个存储单元可以有多个逻辑地址,但仅有一个物理地址!)存储单元的物理地址可由段寄存器即段基址)和偏移地址经运算或变换得到。其算法为:绝对地址啜基址X16左 移 4位)确移地址例 1:段基址存放在段寄存器CS中,即 CS=2000口偏移地址在IP中,即 H 2 0 0 耳则:绝对地址啜基址 与64偏移地址=20000卅2200氏2220011例 2已知:CS=2200H IP=0200H试计算其绝对地址。绝对地址啜基址X164偏移地址旦2
4、000HM)200+22200H由上可知绝对地址为22200H的存储单元它的逻辑地址可以有多个。四、关于计算机中断技术中的基本概念和技术术语:1、中断定义:计算机在执行当前程序或任务时,由于随机或突发事件的产生而暂停当前的工作转去为其服务,服务完成后再返回到刚才的断点处继续在这之前的工作,此过程称之为:中断。2 断点:皿向应中断时程序中止处的CS和 IP的 值 即:程序中止处的下一条指令的地址)o3,中断源:采用中断方式与CPU或系统进行信息交换的外设或部件。4中断向量:中断服务子程序的入口地址被称之为:中断向量。*中断向量表:用来存放中断服务子程序的入口地址的存储区域被称之为:中断向量表。6
5、,中断类型码:在 CRJI响应外设中断请求时,由外设向0 速供的用来查找中断向量表的索引码。7,现场:在中断服务子程序中所使用的那些与主程序中符号相同但定义或作用不同的全局变量、工作寄存器或工作单元等。(即:在执行中断服务子程序时需要保护的内容)&中断优先级:外设产生中断请求时可域中断控制器对其进行响应或处理的先后顺序。9.可屏蔽中断:可使用中断开、关指令控制QU对中断请求的响应。这类中断称之为可屏蔽中断。8086 CPU的开中断指令为S H,可允许CMJ响应外部中断请求。关中断指令为CLI可禁止CM 向应外部中断请求。10,非屏蔽中断:CHJ的中断响应不能使用中断开、关指令进行控制。这类中断
6、称为不可屏蔽中断或非屏蔽中断(不可使用中断开、关指令控制C R J对中断请求的响应。这类中断称之为不可屏蔽中断或非屏蔽中断)o非屏蔽中断的优先级要高于可屏蔽中断。1 1、中断优先级:多个中断源同时申请中断时C R J的响应策略或中断嵌套规则。U采用中断技术的优点:C H H:作效率高、实时性好、便于处理随机和突发事件。U中断响应和处理的实质内容:确定发出中断请求的中断源(即外设)或随机事件,找到并执行为该中断源服务的中断服务子程序。也即:其实质就是为了执行一段服务程序。五、8 0 8 6/8 0 8 8 C P U的中断系统1、中断分类:硬件中断、软件中断和内部操中断。a硬件中断:由外设或外部
7、信号所产生的中断请求称之为:硬件中断。其硬件中断又可分为非屏蔽中断和可屏蔽中断,其中,非屏蔽中断请求信号要连接到QU的 引脚,而可屏蔽中断请求信号要连接到CWJ I N I R引脚.b.软件中断:由执行C H J中断指令:I N T n所产生的中断称为软件中断。c.内部操中断:由QU内部的一些特定操作例如:除 数 为0时所引起的 除 数 为0中断,符号数运算过程中产生溢出时所引起的溢出中断,为方便程序的调试,每执行完一条指令时都可产生一次中断的单步中断等)所引起的中断称之为:内部操作中断。2中断响应条件:a非屏蔽中断:将非屏蔽中断源的中断请求信号连接到C P曲R M 引脚,编写好中断服务子程序
8、,并在主程序的系统初始化程序中建立好中断向量表即:将中断服务子程序的入口地址填写到中断向量表中,其向量表地址由分配给该外设的中断类型码确定)。b.可屏蔽中断:将可屏蔽中断源的中断请求信号连接到C H J的I N I R引脚,编写好中断服务子程序,在主程序的系统初始化程序中建立好中断向量表,并在主程序中的适当位置处使用C P U的开中断指令S T I打 开C FU中断,允 许Q礴收外部可屏蔽中断请求。C软件中断:编写好中断服务子程序,在主程序的系统初始化程序中建立好中断向量表,在需要中断时的程序位置处放一条INTn指令。d内部操中断:编写好中断服务子程序,在主程序的系统初始化程序中建立好中断向量
9、表。当系统中出现特定内部操作(即:除数为0.溢出和单步操作)时即可对其进行服务。e.区中断向量表的建立:即:利用程序或指令将中断服务子程序的入口地址(逻辑地址)填写到中断向量表中。中断向量表的地址由外设的中断类型码确定。例如已知某外设的中断类型码为20耳其中断服务子程序的入口地址为:1234H 567阳为其建立中断向量表就是将中断服务子程序的入口地 址1234H 567迺写到自内存空间地址0段20Hxi开始的连续4个字节的存储单元中,即0000H 20HX4+00000H 20HXH3的连续4个单元中,其存放顺序为:低地址存放低字节,高地址存放高字节:即 自20陶开始的连续4个字节的存储单元的
10、内容分别如下:QOH*4s=12H(20H*4+-2)=64Ei=5 阻(20H*4HD=7 阳4可屏蔽中断的响应过程:(1).从数据总线D B上读取外设提供的中断类型码并暂存.将FR内容存入堆栈保护.6).将标志位IF和IF清0,以便禁止INIR中断.将当前的程序断点CS IP存入堆栈保护.(5).利用外设提供的中断类型码计算中断向量表地址,并从中取出中断处理子程序的入口地址转去执行服务程序.执行完中断服务子程序后恢复断点和FR的内容.从中断返回。(即执行一条中断返回指令 W)第 5章 86系列微型计算机的指令系统一、寻址方式:如何获得操作数的方法称之为寻址方式,8086CRJ的寻址方式有以
11、下4类:1、立即寻址:当操作数直接出现在指令中时称为立即数)寻址2、寄存器寻址:当操作数在CPU内部寄存器中时称为寄存器寻址3、直接寻址:当操作数的地址出现在指令中时称为直接寻址4、寄存器间接寻址:当操作数的地址出现在寄存器中时称为寄存器寻址。在该寻址方式中操作数一定在存储单元中,但存储单元的有效地址要求使用寄存器指定,这些寄存器可以使用BX BR SI和 DI之一,即:存储单元的有效地址要放在这其中的某个寄存器中。有效地址:寻址所需要的偏移地址称之为有效地址注意:在以上寻址方式中若目标操作数是非CS的段寄存器时,只能采用寄存器寻址方式产生或获得操作数!例如:将数据段寄存器E6的内容设置为20
12、00H若直接使用指令:m 2000H是错误的,可改为以下方式:MV 然 2000H注意:两个无符号数相比较时,仅 用 CF标志即可判断两数大小,若 QH)则被减数大于等于减数。两个带符号数相比较时,若 H和 SF状态值相同则说明被减数大于等于减数,否则说明被减数小于减数。因两个相同符号数比较时不会发生溢出!例 1:将 AX内容加1:即 然 H L 锹可以使用指令:Q 然 1;该指令的寻址方式为立即数寻址,具体操作和指令执行时间见P444第 6栏中的第6行:acc,inm即:ABacc,in n;其 中acc为 累 加 器 物imr表示立即数,该指令的时钟周期数为4字节数为2-3b而如果改用:I
13、NC A X指令也可实现AXH;但其指令的时钟周期数为2,字节数仅为1,见P447第25栏中第1行:re g l6因 然 为16位,如果使用NC AL时 为8位操作,即 为reg8。尽管以上2条指令的操作功能相同,但指令执行后对状态标志寄存器的影响是不一样的!皿旨令能影响除控制标志之外的所有的状态标志:CR PR AR ZR SR CJ;但INC指令不影响CF标志!即:若 心OFFH时,执 行INC AL后CF的状态不变!例2将AX内容清0可以使用指令:然 0;该指令的寻址方式为立即数寻址,具体操作和指令执行时间见P450第4唯中第 皑:reg inn)gp:MV reginn;由表中可知该指
14、令的时钟周期数为4字节数为2-工但如果改用:X R 然 感指令,同样也可实现对 阈t 0的目的,但其指令的时钟周期数为3,字节数为2,见P455第75栏中的第1行:reg reg 即:X R reg reg第6章微型计算机的程序设计例3:编一段程序完成符号函数。见P151习 题6.5,答案见P471XYEBEB?;定义自变量 DWUo;定义函数值存放单元 m m 2MV倒X;取自变量送AL以便对其进行判断(NP倒0;影响所有标志位:ZR SK CF等标志位双H SZ;X不 为0转移抽0;YAL;将0送函数值存放单元中HETB近 JS PS;测试符号标志位若转移。见P133转移指令表KCV 凰
15、1;MV X 他;将1送函数值存放单元中PSH TMV AT,MV YHITOFFH;X O,送一L的补码AL;将0送函数值存放单元中P1386 2简单程序例6.1将自10050H起连续存放的两个16位数求和后存入其后。低字节在低地址例 6.1程序1MOVAX,1000H;建立数据段指针MOVDS,AXMOVSI,50H;建立被加数偏移地址指针MOVDI,52H;建立加数偏移地址指针MOVBX,54H;建立和偏移地址指针CLC;清进位位。该指令可省,因下一条指令XOR AX,AX能够影响标志!!XORAX,AX;累加器清0MOVAX,SI;取出被加数送AXADCAX,DI;两数相加MOVBX,
16、AX;存结果HLT5 暂停例 6.1程序2MOVAX,1000H;建立数据段指针MOVDS,AXMOVSI,50H;建立被加数偏移地址指针MOVAX,SI;取出被加数送AXADDAX,SI+2;两数相加,注:仅 2 个数相加时可以不使用带进位加法指令!MOVSI+4,AX;存结果HLT暂停例 6.2将 10050H单元的内容拆为两段,每段4 位,存入其后MOVAX,1000H;建立数据段指针MOVDS,AXMOVSI,50H;建立被加数偏移地址指针MOVAL,SI;取出待拆分数据送ALANDAL,0FH;屏蔽高4 位,分离出低4 位MOVSX+1,AL;存低4 位MOVAL,SI;再次取出待拆
17、分数据送ALMOVCL,4;建立逻辑右移次数计数器SHR AL,CLMOV SI+2,ALHLT;逻里右移4 位分离出高4 位;存高4 位P1406 3分支程序例 6.3计算AX-BX的绝对值例 6.3程序1P141程序有错CLC;该指令可省SUBAX,BX应改用CMP比较指令JCAAMOVDI,2800H建立数据指针MOVDI,AX9存结果HLTAA:SUBBX,AX9由于前面执行SUB指令时操作数AX已被破坏。或改9为:NEGAXMOVDI,2800H9因此得不到正确结果MOVDI,BXMOVDI,AXHLT例 6.3程序2MOVDI,2800H9建立数据指针CMPAX,BX两数比较JCA
18、A若 AX小于BX则转AASUBAX,BX计算两数之差MOVDI,AX存结果HLTAA:SUBBX,AXMOVDI,BXHLT例 6.3程序3MOVDI,2800H5建立数据指针SUBAX,BX*两数相减JCAA若 AX小于BX则转AASUBAX,BX计算两数之差MOVDI,AX存结果HLTAA:NEGAXMOV DI,AXHLT例6.4 从 71H外设输入一个数据M,若 M 小于10则向73H外设输出00H,若 M 大于20则向73H外设输出0FFH,否则向73H外设输出88H。START:INAL,71H;从 71H外设读入数据CLC;该指令可省,因下一条指令CMP AL,10能够影响标志
19、!CMPAL,10;判断是否小于10JCLP1;若小于10则转LP1CMPAL,20;判断是否小于20JCLP2;若小于20则转LP2MOVBL,OFFH;建立M 大于20时的输出数据LP3:OUT73H,BL;将数据输出到73H外设HLTLP1:MOVBL,OH;建立M 小于10时的输出数据JMPLP3LP2:MOVBL,88H;建立中间输出数据JMPLP3P 1 4 3 6.4 循环程序HLT例6.5 求两个8 字节数之和,两数自10050H起连续存放,并将求和结果存入其后。程序1见 P144下面程序2 按 字(16位)求和START:MOV AX,1000H;建立数据段指针MOVDS,A
20、XMOVSI,50H;建立被加数偏移地址指针MOVCX,4;建立计数器CLC;清进位位NEXT:MOV AX,SI;取出第一个数据的低字数据送AXADCAX,SI+8;与第2 个数据的低字相加MOVSI+16,AX;存结果INCSI;调整数据指针INCSI;调整数据指针DECCX;计数器减1JNZNEXT;未完继续下一个字的相加说明:如果使用CX做为计数器时可将上面的两条指令DEC C X 和 JNZ NEXT简化为一条指令:LOOP NEXT见 P133转移类指令表倒数第2 栏“循环控制”指令中的LOOP目标标号程序3 按字节(8 位)求和START:MOV AX,1000H;建立数据段指针
21、MOV DS,AXMOVSI,50H;建立被加数偏移地址指针MOVCX,8;建立计数器CLC;清进位位NEXT:MOV AL,SI;取出第一个数据的低字节数据送AXADCAL,SI+8;与第2 个数据的低字节相加MOVSI+16,AL;存结果INCSI;调整数据指针LOOP NEXT;未完继续下一个字节的相加HLTP 1 4 5例6.6设计一个软件延时程序,延 时 时 间 约l i r i S左右分析:当延时时间不长且计时精度要求不高时,可利用指令的执行时间实现延时,例如:当C P U主 频 为3 V H Z时,其时钟周期为0.1 2 5 u 5如果知道了指令所需要的时钟周期数便可知道指令的执
22、行时间。于是可利用循环程序实现软件延时。即:循环次数云所需延时时间一次循环时间,若循环体中采用即3强 和R T F进行延时,而循环控制指令采用K E P时,从P 4 4 3附 录 幽 指 令 表 中 可 查 到H J S H F指令的时钟周期数是1 4个(见P 4 5 2第5 1栏 右 数 第2列),而R T F指令的时钟周 期 数 是1 2个(见P 4 5 1第4 9栏 右 数 第2列),而B 3 C F W令的时钟周期数是1%个(见P 4 4 9第3 7栏 右 数 第2列),即 跳 转 时(Q J 1不 等 于Q)为1 7个时钟周期,后 继 时 为5个时钟周期。于是:循 环 次 数N 的A
23、2的类型定义见上面例1、例2*组合运算符:(1)定义符号名为新类型;格式:绫 型 PIR啾号名例1:然 VCRD PIR DWX1;将 由A1重新定义为字类型例2 M2V 俎 BYIE PIR 将 由M重新定义为字节类型7.2常 用 伪 指 令 见P1601、符号定义伪指令 作用:对所用符号进行赋值格式:嘛 号 名 B3J 礁达式 定义后不能重新赋值嗡号名=礁达式 定义后可以重新赋值2内存数据(即变量)定义伪指令:即:IB DV ED作用:定义内存变量的类型属性变 量 名 EB 磷达式区段定义伪指令 作用:对段进行命名和定位格式:段名SBMNT 定位方式 连接方式:类别名编程时一般使用默认值(
24、即段边界方式)即可。定位方式是指段的起始地址常用的定位方式(见P 1 6 2如下:勖 页边界,即段起始地址的低8位 为0BARA段边界,即段起始地址的低4位 为0.该方式为系统默认方式VCRQ字边界,即段起始地址的最低位为0B H E任意值4段寄存器说明伪指令格式:空SIM E段寄存器名:段定义名1-工过程定义伪指令:格式:慰程名出工 MWE、回;括号内为过程属性啦程名)BSEP6模块开始伪指令:格式:模块名作用:对程序模块进行命名,模块名可以自行定义,但不能使用关键字!可以默认,其默认名为列表文件标题的前6个字符,若无标题时则默认名为该程序模块的源文件名。7、模块结束伪指令:格式:E N D
25、哈动标号或过程名作用:通知汇编程序源文件结束,并给出执行程序的入口地址。启动地址只有在主程序模块才有意义。&定位伪指令:格式:CRG 礁达式作用:指定数据或程序在内存中的起始偏移地址,从表达式指定的起点开始连续存放直到遇到新的CRG指令为止。表达式为无符号数。女列表伪指令:(1)建立标题:格式:T T IL E标题作用:为列表文件每页的第1行定义大标题(与建立小标题:格式:SUBTIL标题作用:为列表文件每页定义小标题,输出在大标题之后。(3自动排版:格式:眄 行数,每行字数(即列数)作用:为列表文件定义每页行数(1 0-255行)和每行字符数(60 1 3 2,默认值是66行80列。伪指令或
26、说明性语句的作用:对变量、工作单元或符号等进行定义或说明,以增加程序的可读性等。例如:已 知 16位发动机转速测量值存放在2000H和 2001H(高 8位)单元中,8位温度测量值存放在2002H单元中,试编一个程序将转速测量值送水寄存器中,温度测量值送EL寄存器中。程 序 1:然 2000U;将转速测量值送AX寄存器耳 2002E5;将温度测量值送EL寄存器分析:尽管程序简单,但不知内存单元中存放的是何数据,缺乏可读性!程 序 2W A SBMNTCRG 2000HZS DV 0VD EB 0;段定义伪指令;对存放数据的偏移地址进行定位伪指令;分配转速存放单元;定义温度存放单元W A HSD
27、8然 ZS;将转速测量值送物寄存器以 VD;将温度测量值送IX寄存器由此可知利用伪指令对工作单元或变量进行了定义后,使得程序具有了可读性!7.3 宏指令7.3.1宏指令概述:为简化汇编语言程序的书写,将程序中重复出现的内容或代码定义为“宏指令”(即用一条宏指令代替),在其原位置处只需放一条宏调用语句即可,于是可大大简化源程序的书写,提高源程序的可读性。宏指令类似于子程序或过程,但二者有明显的区别:1、执行方式不同:宏 调 用 语 句 属 于 说 明 性 语 句 由 汇 编 程 序 中 的宏处理程序代换进行处理,不会引起CPU的任何操作,而子程序调用或过程调用语句是由CK执行。2对内存空间的占用
28、方式不同:宏指令在执行时是由汇编程序将宏指令出现的地方将其原内容或原程序段换回!只简化书写,不节省内存!而子程序或过程是将重复出现的内容或代码与主程序分开单独存放!其目标代码在内存中只保留一份!既简化书写又节省内存!入CEU工作时间开销不同:由于宏指令在汇编时是将该宏指令所代替的原内容换回,因此CFU在执行程序时无需额外耗费任何时间,而产生子程序或过程调用时,CFU必须要进行断点甚至现场的保护和恢复,从而产生额外的时间开销,而降低程序的执行速度。4对工作参数的要求不同:在进行宏调用时允许改变或修改其工作参数,使得同一条宏指令在各次不同的调用过程中可完成不同的操作,具有较好的灵活性,而子程序或过
29、程一旦被定义,一般不允许修改参数,因此如何子程序或过程在各次调用中只能完成相同的功能。其灵活性不如宏指令!由上归纳可知:一般情况下当程序中重复性的内容或代码较长,且工作参数相对固定时可采用子程序或过程,当程序中重复性的内容较少或代码较短,且希望在各次调用时能够修改工作参数时,宜采用宏调用方式。7.3.2宏指令的定义和使用方法一、宏指令使用说明:宏指令在使用前必须要先进行定义!其步骤如下:1、宏定义:即对程序中所出现的重复性内容或代码进行定义,并起一个名。么宏调用:在程序中出现重复性内容或代码位置处用一条宏调用语句进行替换。(即将其重复性内容或代码位置处通过宏指令名来调用它)X宏扩展(宏展开):
30、由宏汇编程序在宏调用语句(即宏调用指令)处,将原内容换回。并在展开的指令语句左端加上标识符:+二、宏代换和宏调用语句格式:1、宏代换语句格式:宏名 M U 膨式参数1,形式参数2;形式参数为可选项宏体;即需要进行宏代换的内容或代码ENDMZ宏调用语句格式:宏名 实在参数1,实在参数2,;实在参数必须与形式参数对应P167 例:宏定义 阳 M OO Y X;Y粉别为形式参数MT/J XR iY CL;教 材P167原题有错,该语句缺少源操作数!;当被宏代换的内容为指令助记符中的符号;时,要在符号前加宏代换符&HSEM用NPCRO Y X;阳为宏名,Y X为形式参数MV CL,XRQ优 能 CL;
31、或为:CL,CL宏调用:阳 R 5;宏展开:+MZV其中R为和形式参数表中的Y所对应的实在参数5为和形式参数表中的X所对应的实在参数CU 5+RCR 应 CL补充:宏指令和子程序应用举例:已知两位LED数码显示器的I/O地址分别是:个位为LEDO,十位为L E D L试编一个程序将DATA单元的内容送LED进行显示。即该单元的低4位送个位LEDO,高4位送十位LED1。ORG 1000H;程序模块定位DATASEGMENT;定义数据段LED_TBL DB3FH,06H,5 B H,.;建立09的7段LED数码显示器段码表DATA DB36H;预置待显数据DATAENDS;数据段结束STACSE
32、GMENTPARA STACK,DAT ;定义堆栈段STA1DW 10DUP(?)STACENDS;堆栈段结束CODE SEGMENTPARA 4 CODE ;定义代码段ASSUMECS:CODE,DS:DAT,SS:STACSTARPROC FAR;过程定义PUSHDS;保护操作系统当前的数据指针DS:00(即现场)以便执行XORAX,AX;完用户程序后恢复PUSHAXMOVAX,SEG LED_TBL;获取并建立用户数据区的段基址MOVDS,AX;建立用户段MOVAL,DATA;取出数据送ALANDAL,0FH;分离出低4位MOVBX,OFFSET LED_TBL;获取用户数据区的偏移地址
33、XLAT;查表将低4位数据转换为LED七段码 CB LEDO;宏调用OUTLEDO,AL;将查表得到的LED七段码输出到LED外设MOVAL,DATA;再次取出数据送ALSHRAL,1;右移4位分离出高4位SHRAL,1;SHRAL,1;SHRAL,1;MOVBX,OFFSET LED_TBL;获取用户数据区的偏移地址XLAT;查表将低4位数据转换为LED七段码 CB LED1;宏调用OUTLED1,AL;将查表得到的LED七段码输出到LED外设RETSTARENDP;过程结束CODE ENDS;代码段结束ENDSTAR;模块结束;宏定义;即宏代换语句CB MACRO X;C B为宏名,X为形
34、式参数MOV BX,OFFSET LED_TBL;获取用户数据区的偏移地址XLAT;查表将低4位数据转换为LED七段码OUT X,AL;将查表得到的LED七段码输出到LED外设ENDM解法2:采用宏指令方式体体体宏宏宏ORG 1000HDATA SEGMENT;定义数据段LED_TBL DB 3FH,06H,5BH.建立7段LED数码显示器段码表:0-9DATA DB 36H;待显数据DATA ENDS;数据段结束;定位方式,连接方式,类别名(自定义符)STAC SEGMENT PARA STACK DAT ;定义堆栈段STA1 DW 10 DUP(?)STAC ENDS:堆栈段结束BcMAC
35、RO X;宏定义(即宏代换语句):C B为宏名,X为形式参数。MOV BX,OFFSET LED_TBL;获取用户数据区的偏移地址XLAT;查表将低4位薮据转换为LED七段码OUT X,AL;将查表得到的LED七段码输出到LED外设体体体ENDMCODE SEGMENTPARACODE ;定义代码段ASSUMECS:CODE,DS:DAT,SS:STAC;STAR PROCFARPUSHDS;保护操作系统当前的数据指针DS:00(即现场)以便执行XORAX,AX;完用户程序后恢复PUSHAXMOVAX,SEG LED_TBL;获取并建立用户数据区的段基址MOVDS,AX;建立用户段MOVAL,
36、DATA;取出数据送ALANDAL,0FH;分离出低4 位CBLEDO;宏调用指令MOVAL,DATA;再次取出数据送ALSHRAL,1;右移4 位分离出高4 位SHRAL,19SHRAL,19SHRAL,1;宏展开时即为下面3 条语句CBLED1;宏调用指令;+MOV BX,OFFSET LED_TBL;STAR ENDP;+XLATCODE ENDS;+OUT LED1,AL;LED1 为实参END STAR解法3:采用子程序方式完成上例(可利用D X作为入口参数).;只给出执行语句部分,其它内容略PUSHDS;保护操作系统当前的数据指针DS:00(即现场)以便执行XORAX,AX;完用户
37、程序后恢复PUSHAXMOVAX,SEGLED_TBL;获取并建立用户数据区的段基址MOVDS,AX;建立用户段MOVAL,DATA;取出数据送ALANDAL,0FH;分离出低4 位MOVDX,LEDO;建立子程序的入口参数CALLCB;调用子程序MOVAL,DATA;再次取出数据送ALSHRAL,1;右移4 位分离出高4 位SHRAL,1SHRAL,1SHRAL,19MOVDX,LED1;建立子程序的入口参数CALLCB;调用子程序HLTCB:MOV BX,OFFSET LED_TBL;获取用户数据区的偏移地址XLAT;查表将4位数据转换为LED七段码OUT DX,AL;将查表得到的LED七
38、段码输出到LED外设RET汇编语言编程练习:P194 习题7.1 采用查表方式进行程序设计:见P150:6.67.1在数据区中,自T A B L E 开始连续存放06的立方值表,设任给一数X (0 W X W 6)”在T A B 1单元,查表求其立方值,并将结果存入T A B 2单元,在源程序中设置数据段、堆栈段及代码段。STAC ENDS;堆栈段结束CODE SEGMENT PARA CODE ;定义代码段ORG2000H;程序或模块定位伪指令DATSEGMENTPARA D A T,;定义数据段TABLEDBOH,1H,8H,27H,64H,125H,216H;定义数据区,并为其;分配内存
39、单元,也可将其分为2行写TABIDB3;定义X存放单元TAB2DB?;定义存放结果数据单元,并为其分配内存单元DATENDS;数据段结束STAC SEGMENTPARA STACK,D A T二定义堆栈段STA1 DW10DUP(?)ASSUMECS:CODE,DS:DAT,SS:STACSTARPROC FARPUSH DS;保护操作系统当前的数据指针DS:00(即现场)以便执行XOR AX,AX;完用户程序后恢复PUSH AXMOV AX,SEG TABLE;获取数据区的段基址MOV DS,AX;建立用户段MOV BX,OFFSET TABLE;获取数据区的偏移地址MOV AL,TABIX
40、LATMOV TAB2,ALRETSTARENDP;过程结束CODE ENDSEND STAR;代码段结束;程序模块结束若程序不是过程或子程序形式时,当用户程序执行完后应使用以下指令返回操作系统MOV AH,4CH;返回操作系统。或使用MOV AX,4C00HINT 21HP178 7.6 汇编语言程序设计例7.1 将内存中自A 1地址起连续存放的8 个字节的数据转换成ASCII码存于其后,并利用 DOS功能2 号调用在屏幕上显示这些数据,每个数据之间用空格分隔。要求:在源程序中设置数据段、堆栈段及代码段。程序见P179181工作寄存器分配:SI为源数据指针,DI为目的数据指针,CX为循环控制
41、计数器,AX、BX、DX寄存器为工作单元解法1 程序见P1791811:NAME EX1;程序模块命名伪指令(见 P163 6),程序名为:EX12:PAGE 50,70;列表伪指令(见 P163 9),用来定义每页行数50,3:;每行字符数7 0,默认值为66行 80列(即字符数)4:DAT SEGMENT PARA DAT;定义数据段、段边界及类别5:Al DB 12H,34H,56H,78H,9AH,OBCH,ODEH,0F0H6:Bl=$-Al;求符号地址A l到当前汇编指针地址$之间的字节数,;即自A1起存放的数据个数。可使该计数值随数据个数变化7:B2=B1X2;求 2 倍的B1做
42、为ASCH码数据区的长度8:A2 DB B2 DUP(?);定义ASCII码数据区,并为其分配内存单元9:DAT ENDS;数据段结束10:11:STAC SEGMENTPARASTACK DAT;定义堆栈段、段边界及类别12:STA1DW100DUP(?);预留出堆栈区工作单元13:STAC ENDS 堆栈段结束14:15:CODE SEGMENTPARACODE ;定义代码段并对段寄存器进行说明16:ASSUMECS:CODE,DS:DAT,SS:STAC,ES:DAT17:STAR PROC FAR;定义过程,过程名为:STAR,属性:远过程FAR18:PUSHDS;保护操作系统当前的数
43、据指针DS:00(即现场)以便执行19:XORAX,AX;完用户程序后恢复20:PUSHAX21:MOVAX,SEGDAT;获取DAT的段基址22:MOVDS,AX;建立用户的数据段基址23:MOVES,AX;建立用户的附加段基址24:LEASLA1;建立偏移地址指针,LEA指令见P11825:MOVDL OFFSETA2;也可采用该指令26:MOVCX,Bl;建立外循环计数器27:G l:MOVBL,2;建立内循环计数器28:MOVAL,SI;取出一个数据送AL62:RET63:Pl ENDP;过程结束64:CODE ENDS;代码段结束65:END STAR;程序模块结束29:MOVBH,
44、AL;将原数保护到BH30:PUSHCX;保护CX31:MOVCL,4;设置循环移位次数32:RORAL,CL;AL向右循环移位4 位33:POPCX;恢复ex34:G2ANDAL,0FH;分离出高4 位35:36:DAAADDAL,;十进制调整。蓝色语句为将分离出的高4 位转换为ASCH码0F0H;37:ADCAL,40H;转换为十六进制数的ASCII码38:MOVDI,AL;存转换结果39:INCDI;调整ASCII码数据区指针40:MOVAL,BH;回复原数41:DECBL;内循环次数减1未完继续42:JNZG243:INCSI;调整原始数据指针44:LOOP G1;外循环次数减1未完继
45、续45:MOVSI,OFFSET A246:MOVCX,B2;建立调用子程序CALL P l的入口参数47:CALL Pl48:RET49:STAR ENDPCRT屏幕上显示ASCH字符子程序;入口参数SI为待显示的ASCH码数据区指针,CX 待显示的字符个数。50:Pl PROC51:G MOVNEARBL,2;建立计数器52:MOVDL,S I ;将待显字符送DL寄存器做为入口参数53:MOVAH,2;设置系统功能调用号2:显示单字符54:INT21H;执行系统功能调用55:INCSI;调整ASCII码数据区指针56:DECBL;计数器减157:58:JNZMOVTDL,;两字符之间留一个
46、空格,或 MOV DL,20H59:MOVAH,260:61:TINTLOOP21HG;判断是否显完所有字符例7.1 将内存中自A 1地址起连续存放的8 个字节的数据转换成ASCII码存于其后,并利用 DOS功能2 号调用在屏幕上显示这些数据,每个数据之间用空格分隔。要求:在源程序中设置数据段、堆栈段及代码段。解法1程序见P179-181工作寄存器分配:SI为源数据指针,DI为目的数据指针,CX为循环控制计数器,AX、DX寄存器为工作单元解法2 采用子程序方式1:NAME EX1;程序模块命名伪指令(见 Pl63 6),程序名为:EX12:PAGE 50,70;列表伪指令(见 P163 9),
47、用来定义每页行数50,3:;每行字符数7 0,默认值为66行 80列(即字符数)4:DAT SEGMENT PARA DAT;定义数据段、段边界及类别5:Al DB 12H,34H,56H,78H,9AH,OBCH,ODEH,0F0H6:Bl=$-Al;求符号地址A l到当前汇编指针地址$之间的字节数,;即自A1起存放的数据个数。7:B2=B1X2;求 2 倍的B l做为ASCH码数据区的长度8:A2 DB B2 DUP(?);定义ASCII码数据区,并为其分配内存单元9:DAT ENDS;数据段结束10:;.11:STAC SEGMENT PARA STACK,DAT;定义堆栈段、段边界及类
48、别12:STA1 DW 100 DUP(?)13:STAC ENDS;堆栈段结束14:;.15:CODE SEGMENTPARA CODE ;定义代码段并对段寄存器进行说明16:ASSUMECS:CODE,DS:DAT,SS:STAC,ES:DAT17:STAR PROC FAR;定义过程,过程名为:STAR,属性:远过程FAR18:PUSH DS;保护操作系统当前的数据指针DS:00(即现场)以便执行19:XOR AX,AX;完用户程序后恢复20:PUSH AX21:MOV AX,SEG DAT;获取DAT的段基址22:MOV DS,AX;建立用户的数据段基址23:MOV ES,AX;建立用
49、户的附加段基址24:LEA SLA1;建立偏移地址指针,取有效地址指令LEA见 P11825:MOV DL OFFSET A2;建立偏移地址指针26:MOV CX,B1;建立外循环计数器27:G l:MOV BL,2;建立内循环计数器28:MOV AL,S I ;取出一个数据送AL29:MOV AH,AL;将原数保护到BH30:SHR AL;先分离出高4 位 蓝色指令表示与解法1 中不同之处31:SHR AL32:SHR AL33:SHR AL34:CALL P2;调子程序转换为ASCII码35:MOV AL,AH;恢复原数36:AND AL,0FH;分离出低4 位37:CALL P2;调子程
50、序转换为ASCH码38:INC SI;调整原始数据指针;在 CRT屏幕上显示ASCH字符子程序;入口参数SI为待显示的ASCH码数据区指针,CX为待显示的字符个数,出口参数为ASCII码数据区。AX、BX为工作单元39:LOOP G140:MOVSLOFFSETA241:MOVCX,B2;建立调用子程序CALLP l的入口参数42:CALL Pl43:RET44:STAR ENDP45:PlPROC NEAR46:GMOVBL,2;建立计数器47:MOVDL,S I ;将待显字符送DL寄存器做为入口参数48:MOVAH,2;设置系统功能调用号2:显示单字符49:INT21H;执行系统功能调用5