微机原理分支程序实验

2023-03-13

第一篇:微机原理分支程序实验

微机原理微机原理课程设计程序.asm

微机原理课程设计程序

CODE

SEGMENT

ASSUME

CS:CODE; 初始化8255A,A口工作方式0,输出 START: MOV

DX,63H

MOV

AL,08BH

MOV

BL,OAH

OUT

DX,AL DY:

MOV

CX,30C4H;置定时外循环初始值 MM:

MOV

BH,0AH;置定时内循环初始值

DEC

LP:

MOV

IN

DEC

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

JMP

LP1:

MOV

MOV

JMP

LP2:

MOV

MOV

JMP

LP3:

MOV

MOV

CX DX,62H AL,DX;读取C口值 BH BH,00H MM CX,0000H XD;转向剩余时间显示程序 AL,00H;判断是否有键按下 LP AL,01H;判断是否是1号键按下 LP1 AL,02H;判断是否是2号键按下 LP2 AL,04H;判断是否是3号键按下 LP3 AL,08H;判断是否是4号键按下 LP4 AL,10H;判断是否是5号键按下 LP5 AL,20H;判断是否是6号键按下 LP6 AL,40H;判断是否是7号键按下 LP7 AL,80H;判断是否是8号键按下 LP8 LP AL,86H AH,01H EN

;显示1号抢答成功者并锋鸣

AL,0CBH AL,02H EN

;显示2号抢答成功者并锋鸣

AL,0CFH AH,0CFH

JMP

EN

;显示3号抢答成功者并锋鸣 LP4:

MOV

AL,0E6H

MOV

AH,08H

JMP

EN

;显示4号抢答成功者并锋鸣 LP5:

MOV

AL,0EDH

MOV

AH,10H

JMP

EN

;显示5号抢答成功者并锋鸣 LP6:

MOV

AL,0FDH

MOV

AH,20H

JMP

LP7:

MOV

MOV

JMP

LP8:

MOV

MOV

JMP

EN:

MOV

OUT

MOV

MOV

OUT

JMP

XD:

DEC

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

CMP

JZ

XD9:

MOV EN

;显示6号抢答成功者并锋鸣 AL,87H AH,40H EN

;显示7号抢答成功者并锋鸣 AL,0FFH AH,80H EN

;显示8号抢答成功者并锋鸣 DX,60H DX,AL DX,61H AL,AH DX,AL MD BL

;判断剩余时间并转向显示程序 BL,09H XD9 BL,08H XD8 BL,07H XD7 BL,06H XD6 BL,05H XD5 BL,04H XD4 BL,03H XD3 BL,02H XD2 BL,01H XD1 BL,00H XD0 AL,6FH;显示剩余9秒

JMP

EN1 XD8:

MOV

AL,7FH;显示剩余8秒

JMP

EN1 XD7:

MOV

AL,07FH;显示剩余7秒

JMP

EN1 XD6:

MOV

AL,7DH;显示剩余6秒

JMP

EN1 XD5:

MOV

AL,6DH;显示剩余5秒

JMP

EN1 XD4:

MOV

JMP

XD3:

MOV

JMP

XD2:

MOV

JMP

XD1:

MOV

JMP

XD0:

MOV

JMP

EN1:

MOV

OUT

CMP

JZ

JMP

MD:

MOV

IN

CMP

JZ

JMP

MOV

INT

CODE

ENDS

END

AL,66H;显示剩余4秒

EN1 AL,4FH;显示剩余3秒

EN1 AL,4BH;显示剩余2秒

EN1 AL,06H;显示剩余1秒

EN1 AL,3FH;显示剩余0秒,结束。

EN1 DX,60H DX,AL AL,3FH MD DY DX,61H;一定时间后,若再有输入,则转向某剩余时间AL,DX AL,00H MD DY AH,4CH 21H START

第二篇:微机原理实验总结

不知不觉,微机原理与接口技术实验课程已经结束了。回想起来受益匪浅,主要是加深了对计算机的一些硬件情况和运行原理的理解和汇编语言的编写汇编语言,对于学习机电工程的自动控制和计算机都是很重要的,因为它是和机器语言最接近的了,如果用它来编程序的话,会比用其它高级语言要快得多。本学期我们在老师的带领下,进行了微机原理实验六到十这五组实验。它们分别是: 实验六

8255 PA口控制PB口

实验目的

掌握单片机系统中扩展外围芯片的方法,了解 8255 芯片的结构及编程方法。 实验内容

用 8255 PA 口作开关量输入口,PB 口作输出口。

实验步骤

1、用8 芯线将8 255 PA口接至开关Kl~K8,PB口接至发光二极管L1~L8;

2、运行程序 HW06.ASM,拨动开关K1~K8,观察L1~L8发光二极管是否对应点亮。

实验七

8255控制交通灯

实验目的

进一步了解8 255 芯片的结构及编程方法,学习模拟交通控制的实现方法。

实验内容

用8255 做输出口,控制六个发光二极管燃灭,模拟交通灯管理。

实验步骤

1、用双头线将 8 255 PA0~PA2 口接至发光二极管L3~L1,PA3~PA5口接至发光二极管L7~L5;

2、执行 程序HW07.ASM,初始态为四个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。 实验八

简单I /O口扩展

实验目的

学习单片机系统中扩展简单I/O 口的方法; 学习数据输入输出程序的编制方法。 实验内容

利用74LS244 作为输入口,读取开关状态,并将此状态,通过74LS273再驱动发光二极管显示出来。

五、实验步骤

1、用8 芯线将Y0~Y7接至开关K1~K8,Q0~Q7 接至发光二极管L1~L8, 用双头线将 CS1 接至8 000 孔,CS2 接至9 000 孔,用8 芯线将J X0 接至JX7(D0~D7数据线);

2、执行程序 HW08.ASM,按动开关K1~K8,观察发光二极管L1~L8是否对应点亮。

实验九

A/D 0809转换实验

实验目的

)掌握A/D 转换与单片机接口的方法;

)了解A/D 芯片0809转换性能及编程方法;

)通过实验了解单片机如何进行数据采集。 实验内容

利用实验系统上的 0809 做A /D 转换器,实验系统上的电位器提输入,编制程序,将模拟量转换成数字,通过数码管显示出来。 实验步骤

1、用双头线将可调电压区的VOUT接至ADC0809 模数转换区的IN0,可调电压区的VIN 接至电源+5V,ADC0809 模数转换区的CS4 接至系统接口区的8000H 端口,ADC0809模数转换区的WR接至系统接口区的/IOWR端口,ADC0809 模数转换去的 RD 接至系统接口区的/IORD,ADC0809 模数转换区的ADDA、ADDB、ADDC接至G ND,CLK接至单脉冲与时钟区的500K,用8 芯线将数据总线JX0 接至A DC0809模数转换区的JX6;

2、运行程序 HW09.ASM,数码管上显示0809.XX,后二位显示当前采集的电压转换的数字量,调节可调电压,该二位将随着电压变化而相应变化,变化范围为00至FF。

实验十

D/A 0832转换实验

实验目的

(1)了解D/A 转换与单片机的接口方法;

(2)了解D/A 转换芯片 0832 的性能及编程方法;

(3)了解单片机系统中扩展D/A 转换芯片的基本方法。

实验步骤

1、用双头线将DAC0832 数模转换区的CS5 端口接至系统接口区的8000H端口,WR端口接至系统接口区的/IOWR端口,AOUT输出接电压表或小直流电机DJ,用8 芯线将DAC0832 数模转换区的JX2 接至数据总线JX0

2、运行程序HW10.ASM,数码管上显示不断加大或减小的数字量,数字变化范围 00 到FF,用万 用表测试 D/A 输出孔 AOUT 应能测出不断加大或减小的电压值,电压变化范围 0V 到5V。

这次实验课程加深了我们对汇编语言指令的熟悉和理解。不仅巩固了书本所学的知识,还具有一定的灵活性,发挥了操作,加深了我们对硬件的熟悉,锻炼了动手能力,发挥创造才能。

通过这次课程使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

这门课程可以阐明微处理器,汇编语言程序设计,计算机结构和操作系统等基本概念。详尽地论述了有关微处理器及其指令系统的概念和程序设计方法,介绍构成微型计算机的存储器,接口部件,总线等各项技术。.微机的最基础语言--汇编语言是一个最基础最古老的计算机语言,依赖于计算机的低级程序设计语言。汇编语言是我们理解整个计算机系统的最佳起点和最有效途径。汇编是对寄存的地址,以及数据单元进行最直接的修改,而在某些时候,这种方法的确是最有效,也是最可靠的.然而有优点,自然也就有缺点,最重要的一点就是汇编语言很繁琐,对某个数据进行修改时,本来很简单一个操作会用很多条繁琐的语句来解决,而这些语句本身在执行和操作的过程中,占用大量的时间和成本。并有大量的程序和硬件设计类题目,使我们能够深入了解计算机的原理、结构和特点,以及如何运用这些知识来设计一个实用的微型计算机系统。具体来说,就是掌握Intel8086/8088微型计算机系统地组成原理,熟练运用8086宏汇编语言进行程序设计,熟悉各种I/O接口芯片的配套使用技术,并通过一定的课程实验与实践,进一步提高系统设计的能力,使学生能够完成实用的微型计算机系统的软硬件设计。

学习该门课程知识时,其思维方法也和其它课程不同,该课程偏重于工程思维,具体地说,在了解了微处理器各种芯片的功能和外部特性以后,剩下额是如何将它们用于实际系统中,其创造性劳动在于如何用计算机的有关技术和厂家提供的各种芯片,设计实用的电路和系统,再配上相应的应用程序,完成各种实际应用项目。

这次实验并不是很难,主要的困难来自对程序的理解。我们最后对实验的原理有了清晰的认识。让我们知道了实验台上各个模块的用法;而且它还让我们对自己动手写程序来控制实验台的运作有了一定的基础。虽然实验台只是一个小型的模拟平台,但是通过对它的学习和操作,我们对有关接口的知识将会有一个更广泛的认识,而且它对我们以后的学习也会有帮助的。

实验中个人的力量是不及群体的力量的,我们分工合作,做事的效率高了很多。虽然有时候会为了一些细节争论不休,但最后得出的总是最好的结论。而且实验也教会我们在团队中要善于与人相处,与人共事,不要一个人解决所有问题。 总之,这次课程设计对于我们有很大的帮助,通过课程设计,我更加深入地理解了,微机原理课程上讲到的各种芯片的功能,以及引脚的作用,同时加深了对于主要芯片的应用的认识,同时在试验室的环境里熟悉了汇编程序的编写过程和运行过程,最后还提高了自己的动手能力 对课程设计的建议

本次课程设计的几个实验相对都比较简单,而且经过老师的讲解以及实验书上的指导,几乎把我们要用到的程序和实验台电路的接线方法都告诉我们了,所以做起来很容易。

实验过程中,获得了很多收获,获得了很多感悟,当然也遇到了很多困难。但我们都一一克服了他们,成功的完成了实验。并在解决问题,克服困难的过程中,发现了自己平时忽略的,隐藏的问题,以及一些不该出现的粗心大意的小毛病。通过这些,我们认识的更加深刻,了解的更加深入。做到了学以致用,对知识掌握得更加牢固。通过了这一学期对微机原理的学习,真的对它有了一个全新的认识,我会坚持对它的学习,使自己在汇编语言上有一个长足的提高!

第三篇: 微机原理与接口技术实验总结

11107108

徐寒黎

一、 实验内容以及设计思路

1、①试编写一程序,比较两个字符串STRING

1、 STRING2 所含字符是否相同,若相同输出“MATCH”,若不相同输出 “NO MATCH”。 设计思路:定义一个数据段,在数据段中定义两个字符串作为STRING

1、 STRING2以及几个用于输入提示的和输出所需内容的字符串,定义一个堆栈段用于存放,定义代码段。关键步骤以及少量语句:第一步将STRING1和STRING2都实现用键盘输入,方法是

MOV DX,OFFSET STRING2 MOV AH,0AH INT 21H 并且显示在显示器上,显示方法将0AH改成09H,语句与上面类似。 然后进行比较第一个单元, MOV AL,[STRING1+1] CMP AL,[STRING2+1] JNZ NOMATCH 若字符串长度不等,则直接跳转,输出输出 “NO MATCH”; 若长度相等再逐个比较 LEA SI,[STRING1+2] LEA DI,[STRING2+2] MOV CL,[STRING1+1] MOV CH,0 CLD REPE CMPSB JCXZ MATCH,意思是全部相同就跳转MATCH,输出“MATCH”;不然进入下面的NOMATCH。退出。

②试编写求级数1^3+2^3 +3^3 …..前几项和刚大于10000的程序。

设计思路:原先编写的程序,设定和为10000,结果是14。但要求高一点的话,可以自己设置,实现用键盘输入和的值。

一个难点是将输入的ASCII码字符串,转换成与之相同的十进制数的数值。 关键的思路部分是:从1开始求级数,将和的值存在AX里,要加下一项级数前,比如这时已经加到4,PUSH一下AX,然后将5乘三遍,将乘积MOV到BX里,再POP AX,然后将BX的值加到AX里,然后将AX与N比较,如果比N小就继续上述步骤,知道刚比N大就输出数字。

③试编写一程序,完成字符串中各字符出现频度的统计,统计结果在屏幕上输出。

设计思路:因为这个程序需要统计所有的字符,所以首先要定义一个存储区,用来存放26个字符以及每个字符出现的个数。用键盘控制输入字符串以后,将字符串的第一个字符与这二十六个字符逐个比较,若有相同,在存放相应次数的存储单元的值上加1。然后比较第二个字符,依次类推,将字符串里的字符全部比较完。将个数大于1的字符以及字符的个数都输出到屏幕上。退出语句。 缺点和不足:这样需要定义一个非常繁的存储区。可以根据输入的字符,然后进行比较和统计。

④设计一个动画程序。

设计思路:这个程序参考了网上的资料,没有什么新意,是小鸟的图形,可以用上下左右键进行移动,可以退出。

步骤:首先设置堆栈段,数据段,代码段,设置显示方式等一些属性,设置背景色,设置小鸟的初始位置以及写出小鸟图形的像素的点。功能性的语句是,用键盘接受一个输入,将其与1bh比较,用JZ语句跳转到退出。若不是便与48h比较,看是否为向上,是则跳转到相应语句,不是则继续与50h比较;,看是否向下,是则跳转到关于向下移动的相关语句,否则再与4bh比较,看是否向左,依次类推,根据键盘输入的上下左右跳转到不同的语句。再将小鸟的位置进行与上下左右键的输入相应的移动。

最后编写好退出语句。

2、硬件接口主要是了解8255与8253的功能,以及控制字。 ①I/O地址译码

只要对硬件概念清晰,很简单的。基本上没有什么创造性。 收获:熟悉实验箱结构,了解每部分元件和标注的意义。 掌握I/O地址译码电路的工作原理。 ②可编程定时器8253 1,对照实验电路图,将计数器0设置为方式0,即数初值设为N(N<0fh),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并用逻辑笔观察OUT0点平变化。

2,将计数器0、计数器1分别设置为方式3,计数初值设为1000用逻辑笔观察out1输出电平的变化。

收获:掌握8253的基本工作原理和编程方法

③并行接口8255 1,试验电路如图所示,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。 3,数码管静态显示:按下图接好电路,将8255A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接5V(选中),S0和dp接地(关闭)。编程从键盘输入一位十进制数(0-9),在七段数码管上显示。

4,数码管动态显示:按下图接好电路,七段数码管的连接不变,位码驱动输入端S

1、S0接8255 C口的PC1和PC0。编程在两个数码管上显示“56”。

动态显示时,先送“5”的段码送A口,再送02h到C口为位码;经一定延时后,送“6”的段码送A口,再送01h到C口为位码。循环完成,可以显示数码。 5,数码管动态显示(选做):同图接好电路,编程在两个数码管上显示循环显示“00-99”。 只要搞清楚各个口的地址,以及选择适当的控制字,其实很简单的。

收获:掌握8255的基本工作原理和编程方法,对方式0的认识加深了。

二、 试验中遇到的问题 1在编写程序时,我深深体会到,画程序框图的重要性,每一步跳转的条件一定要搞清楚,Y和N不能搞反了,否则就错了。

2实验2,里面涉及的寄存器很多,很容易就会用乱了,还是很需要注意的。 3比如那个小鸟动画的题目,当时在控制左右移动的时候,选择的起始位置的语句没写对位置,每次按一个移位的键以后,都从最初的初始位置向某个方向移动。

4硬件方面的,一开始没搞懂地址什么意思,所以连线时很懵懂,后来清楚了,发现就没什么了。

三、心得感受

微机原理与接口技术的课程实验历时大半个学期,通过自己编写、运行程序,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。

前四个简单程序设计,加深了我们对初学的汇编语言指令的熟悉和理解,汇编语言直接描述机器指令,比机器指令容易记忆和理解。通过学习和使用汇编语言,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。不仅巩固了书本所学的知识,还具有一定的灵活性,发挥了我们的创造才能。

后面几个实验是并行输入输出接口8255和计数器8253的功能的操作,加深了我们对硬件的熟悉,锻炼了动手能力,发挥创造才能。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在自己的思考以及和同学的讨论中,终于迎刃而解。

第四篇:【微机实验】2018东南大学微型计算机原理及应用实验二

实验二 基本算术和逻辑运算

学院:信息科学与工程学院

姓名:周信元

学号:04016523 实验日期:2018.4.4

一、实验目的

1.熟悉算术和逻辑运算指令的功能。

2.进一步了解标志寄存器各标志位的意义和指令执行对它的影响。

二、实验任务

1.采用单步执行方式执行下列各程序段,检查各标志位的情况。

程序段1 MOV AX, 10101H MOV SI, 2000H ADD AL, 30H ADD AX, SI

;AX=1010H

;SI=2000H

;AX=1040H

;AX=3040H ;BX=03FFH MOV BX, 03FFH ADD AX, BX

;AX=343FH ;DS:[0020]=1000H ;DS:[0020]=443FH MOV[0020],1000H ADD 0020, AX 程序段2: MOV AX, OA0AOIH ADO AX, OFFFFH

;AX=A0A0H ;AX=A09FH MOV CX, OFFOOH ADD AX, CX SUB AX, AX INC AX

;CX=FF00H ;AX=9F9FH

;AX=0000H

;AX=0001H

;CX=FFFFH OR CX, OOFFH AND CX, OFOFH M0V[0010],CX 程序段3: MOV BL, 25H MO[0010],04H MOV AL, [0010] MUL BL 程序段4: MOV BL, 04H

;CX=0F0FH ;DS:[0010]=OFOFH

;BX=0025H ;DS:[0010]=04H

;AX=0004H

;AX=0094H

;BX=0004H MOV WORD PTR L0010], 0080H ;DS:[0010]=0080H MOV AX, [0010] DIV BL 程序段5: MOV AX, 00 DEC AX

;AX=0000H ;AX=FFFFH

;AX=3FFEH

;AX=0080H ;AX=0020H ADC AX, 3FFFH ADD AX, AX

;AX=7FFCH NOT AX SUB AX, 3

;AX=8003H ;AX=8000H

;AX=FBFDH OR AX, OFEFDH AND AX, OAFCFH SHL AX, 1 RCL AX, 1 步骤

;AX=ABCDH ;AX=579AH ;AX=AF35H (1)进入 Turbo Debugger,在CPU窗口下输入程序段 2)将IP指针指向程序段开始处 (3)按下F7键(单步)运行程序。

(4)分析各条指令执行后的结果与各标志位在指令执行后对它的影响

2.将寄存器BⅨ作地址指针,自BX所指的内存单元(0010HD)开始连续存放着三个无符号数(10H、04H、30H),。试编写程序分别求它们的和与积,并将结果存放在这三个数之后的单元中。

求和程序段

MOV[0010],10H MOV[0011],04H MOV[0012],30H SUB AX, AX MOV BX, 0010H MOV AL, BXI ADD AL, [BX+1] ADD Al, [BX+2] MOV [BX+3], AL 结果[DS:0013]=44H 求积程序段

MOV[0010],10H MOV[0011],04H MOV[0012],30H SUB AX, AX MOV A1,[0010] MOV BL, [0011 MUL BL MOV BL, [0012] MUL BL MOV [0013], AX 结果[DS:0013=0C00H 3.写出完成下述功能的程序段 (1)传送15H到AL寄存器。 (2)将L的内容乘以2 (3)传送15H到L寄存器 4)AL的内容乘以BL的内容。 最后结果(AX)=?

MOV AL, 15H SHL AL, 1 MOV BL, 15H MUL BL 结果(AX)=0372H 4.写出完成下述功能的程序段

(1)从地址DS:0000H单元中,传送一个数据58H到AL寄存器。 (2)把AL寄存器的内容右移两位

(3)再把L寄存器的内容与字节单元DS:0001H中的数据12H相乘。 (4)将乘积存入字单元DS:0002H中

M0V[0000],58H MOV[0001],12H MOV AL, [0000] SHR AL, 02 MOV BL, [0001] MUL BL MOV [0002], AX 结果[0002]=018CH 5.假设下面的程序段用来清除数据段中相应字存储单元的内容(即零送到这些存储 单元中去),其偏移地址从0010H到0020H (1)将第4条比较指令语句填写完整(划线处) MOV SI, 0010H NEXT: MOV WORD PTR[SI]. 00 ADD SI, 0022H CMP SI, INE NEXT (2)假设要清除偏移地址从0020H到001字存储单元中的内容(即由高地址到 低地址清零),试编写程序段。

MOV SI, 0020H NEXT MOV WORD PTR[S1], 00 SUB SI, 2 CMP SI, 000EH JNE NEXT

三,实验设备

IBM-TC/XT微机一台

四、实验预习要求

1.复习8086指令系统的算术和逻辑运算指令 2,按照题目要求在实验前编写好程序

五、实验报告要求

1.整理出运行正确的各题源程序段和结果, 2.,简要说明ADD指今和AND指令对标志位的影响。

1. 见报告中加粗文字部分

2. 普通加法指令ADD, 指令格式:ADD Reg/mem,Reg/mem/imm受影响标志位:AF/CF/OF/PF/SF/ZF 逻辑与操作指令AND,指令的格式: AND Reg/Mem, Reg/Mem/imm受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)

第五篇:微机原理指令小结

8086CPU指令小结

所有指令:

(1)立即数不能作为目的操作数。

(2)不能在2个存储单元之间直接进行操作(串操作除外)。

(3)MOV指令和堆栈指令是惟一能对段寄存器进行操作的指令。 (4)源和目的操作数的数据类型必须匹配,都是8位,或都是16位。 (5) CS 、IP不能直接作为操作数。 (6)指令中至少要有一项明确说明传送的是字节还是字,如果没有,可通过PTR进行设置。

一、传送指令

(1)6种指令:通用传送指令、堆栈操作指令、交换操作指令、I/O操作指令、目的地址传送指令和标志传送指令。

(2)对标志位的影响:除标志传送(SAHF、POPF)外,均不影响标志位。 (3)操作数表示方法:立即数——data,存储器单元地址——mem,

寄存器——reg, 段寄存器——segreg。

1. 通用传送指令:完成数据传送

(1)指令格式:MOV OPRD1,OPRD2 ;[目的操作数OPRD1]← [源操作数OPRD2] (2)源OPRD2: data、mem、reg、segreg。 (3)目的OPRD1: mem、reg、segreg。

(4)通用传送指令MOV和堆栈指令是唯一允许以段寄存器(代码段寄存器CS和指令指针IP除外,即CS 、IP不能作为直接操作数)作为操作数的指令,不允许通过MOV指令直接以立即数方式给段寄存器赋值,不允许直接在两个段寄存器之间直接进行传送。

(5)8位/16位操作。

2. 堆栈操作指令:将数据压入/弹出堆栈 (1)指令格式:

入栈:PUSH OPRD;先修改堆栈指针SP-2,然后将数据压入堆栈。

;SP =SP-1,[SP]=操作数高8位; SP =SP-1,[SP]= 操作数低8位。 出栈:POP OPRD; 先将数据弹出堆栈,然后修改堆栈指针SP+2。

;(操作数低8位)←[SP],SP =SP+1;(操作数高8位)←[SP],SP =SP+1。 (2)操作数:mem、reg、segreg。操作数不能是立即数data。 (3)仅能进行字运算(16位操作)。

(4)堆栈存取原则为后进先出,只有一个入/出口SS:SP, SP始终指向栈顶,SP是自动修改的,SP在初始化中需要设置。

(5)PUSH、POP指令必须成对使用。

3. 交换操作指令:XCHG——数据交换;XLAT——完成一个字节的换码转换 (1)指令格式:

交换操作指令: XCHG OPRD1,OPRD2;[OPRD1]←→ [OPRD2] 累加器换码指令(表转换指令、查表指令):XLAT;(AL)← ((DS)×16+(BX)+(AL)) (2)XCHG:段寄存器和立即数不能作为一个操作数,8位/16位操作。

(3)XLAT:表首地址在BX中,AL的内容作为某一项到表首的偏移量(256字节的 1 表的下标),转换后的结果存放在AL中。

4. I/O操作指令:累加器(AX/AL)与I/O端口之间的数据传送 (1)指令格式:

输入指令:IN AL/ AX,PORT;(AL/ AX)← [PORT]

IN AL/ AX,DX

;(AL/ AX)← [DX]

输出指令:OUT PORT,AL/ AX ;[PORT]←(AL/ AX)

OUT DX ,AL/ AX

;[DX]←(AL/ AX)

(2)当端口地址≤ 255时,使用PORT(8位端口直接地址);当端口地址≥255时,必须用DX( 16位端口直接地址)作桥梁。DX作端口寻址最多可寻找64K个端口。

(3)PORT为直接寻址,8位/16位操作。 5. 目的地址传送指令

(1)取有效地址指令:LEA OPRD1,OPRD2

或: LEA reg,[add] ;( reg)← add, add为有效地址

把存储器的有效地址EA(源操作数的地址偏移量)送入一个寄存器reg;常用于将一个16位的通用寄存器作为地址指针。传送的是有效地址EA。 (2)将双地址指针装入DS和另一个寄存器指令LDS指令:

LDS OPRD1,OPRD2

或: LDS

reg,[add] ;(reg)← (add+1)(add), (DS)←(add+3)(add +2) (3)将双地址指针装入ES和另一个寄存器指令LES指令:

LES OPRD1,OPRD2

或: LES

reg,[add] ;(reg)←(add+1)(add), (ES)←(add+3)(add +2)

① 从源操作数指定的存储单元中取出4字节的地址指针(包括2字节的段地址和2字节的偏移量)传送到DS/ES和reg。指定将段地址送入DS/ES,偏移量部分送入一个16位的指针寄存器或变址寄存器。

② 源操作数mem,目的操作数必须是一个16位的通用寄存器。 ③ 传送的是存储单元的内容,而不是存储器的有效地址EA。 6. 标志传送指令

(1)读标志指令:LAHF; (AH)← (FR)0~7

功能:将标志寄存器中的SF、ZF、AF、PF和CF(即低8位)传送至AH寄存器的指定位,空位没有定义。

(2)存标志指令:SAHF; (FR)0~7 ←(AH)

功能:将寄存器AH的指定位,送至标志寄存器的SF、ZF、AF、PF和CF位(即低8位)。根据AH的内容,影响上述标志位,对OF、DF、 IF和TF无影响。

(3)标志入栈指令:PUSHF;将FR入栈。(SP)←(SP)-2,((SP)+1,(SP))←(FR) 功能:将标志寄存器FR压入堆栈顶部,同时修改堆栈指针,不影响标志位。 (4)标志弹出栈指令:POPF;将栈顶的内容弹出到FR中。

;(FR)←((SP)+1,(SP)), (SP)← (SP)+ 2

功能:堆栈顶部的一个字,传送到标志寄存器FR,同时修改堆栈指针,影响标志位。

二、算术运算指令

(1)9种指令:加法指令、减法指令、增量//减量指令、求补指令、比较指令、乘法指令、除法指令、字节字/转换为字扩展指令和十进制调整指令。

(2)对标志位的影响:

2 ① 加、减、比较指令(CMP)、取补指令(NEG)指令均影响6个标志位CF、OF、PF、SF、ZF和AF。

② 乘法指令影响CF和OF标志;除法指令所有标志位都不确定,无意义。

③ 增量//减量指令影响除进位标志CF以外的5个标志位AF、OF、PF、SF和ZF。 ④ 字节字/转换为字扩展指令不影响标志位。

⑤ 加法的ASCII调整指令AAA,十进制调整指令 DAA影响除溢出标志OF以外5个标志: CF、PF、SF、ZF和AF;OF没有意义。

⑥ 减法的ASCII调整指令 AAS、十进制调整指令 DAS影响 2个标志:CF和AF;其余标志没有意义。

⑦ 乘法的ASCII调整指令AAM 、除法的ASCII调整指令AAD 根据AL寄存器的结果影响SF、ZF和PF。

1.加法指令 (Addition):完成加法操作。 (1)格式:ADD/ ADC

OPRD1,OPRD2 ;(OPRD1)←(OPRD1)+(OPRD2) (2)源: data、mem、reg;目的:reg,mem。 (3)ADC指令主要用于多字节运算中。 (4)8位/16位操作。

2.减法指令(Subtraction) :完成减法操作。 (1)格式:SUB/ SBB OPRD1,OPRD2;(OPRD1)←(OPRD1)-(OPRD2) (2)规定同加法指令。

3. 增量(加1 )/减量(减1 )指令INC/ DEC:完成+1/-1操作。 (1)格式:INC/ DEC OPRD; (OPRD)←(OPRD)±1

(2)功能:主要用于在循环程序中修改地址指针和循环次数等。 (3)操作数:reg、mem。

4. 求补指令NEG:完成补码操作。 (1)格式:NEG OPRD (2)操作数:reg、:mem。

5. 比较指令CMP:完成减法操作,结果不回送,反映在标志位上。 (1)格式:CMP OPRD1,OPRD2; (OPRD1)-(OPRD2)

(2)功能:主要用于比较两个数之间的关系。在比较指令之后,根据标志即可判断两者之间的关系。减法操作,结果不回送目的操作数。

(3)两数关系的判断标志 ① A=B 用 ZF=1 判断;

② 两个无符号数的大小用CF判断。CF=1,AB。

③ 两个符号数的大小用SF⊕OF判断。SF⊕OF=1,AB。

JG/JNLE(大于, SF⊕OF=0且 ZF=0 ) JL/JNGE (小于, SF⊕OF=1且 ZF=0 ) 6. 乘法指令MUL/ IMUL:完成无符号乘法/带符号(整数)乘法操作。 (1)格式:MUL/ IMUL OPRD ;8位:(AX) ← (AL)╳( OPRD )

;16位:(DX) (AX) ← (AX)╳( OPRD )

(2)源操作数:reg、mem,由指令给出。 (3)目的操作数:默认在AL/AX中。

(4)带符号数乘法指令IMUL当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。

(6)可完成字节与字节乘法、字与字乘法操作。

3 7. 除法指令DIV/ IDIV:完成无符号除法/带符号(整数)除法操作。

(1)格式:DIV/ IDIV OPRD; 8位:(AL) ← (AX)/( OPRD ) ……(AH) (余数)

;16位:(AX) ← (DX) (AX)/( OPRD) ……( DX )(余数) (2)源/目的操作数规定同乘法指令。

(3)对于符号数,当被除数不够位数时,需要对高8/16位进行扩展符号扩展。

8. 字节字/转换为字扩展指令CBW/CWD:将AL/AX寄存器的最高位扩展到AH/DX。 (1)格式:CBW/CWD (2)功能:将AL/AX寄存器的最高位扩展到AH/DX, AL.7(AX.15)=0,则AH(DX)=0;AL.7(AX.15)= 1,则AH=0FFH(DX=0FFFFH)。

9. 十进制调整指令

(1)压缩BCD码:每个字节表示两位BCD数;

非压缩BCD码:用一个字节表示一位BCD数,在这字节的高四位用0填充。

(2)每条十进制调整指令在使用时都与相应的算术运算指令配合,并自动对相应的算术运算指令结果进行相应的十进制调整。

(3)格式:

① DAA:压缩的BCD码加法调整

② DAS:压缩的BCD码减法调整 ③ AAA:非压缩的BCD码加法调整 ④ AAS:非压缩的BCD码减法调整 ⑤ AAM:乘法后的BCD码调整

⑥ AAD:除法前的BCD码调整

三、逻辑运算和移位指令

1. 逻辑运算指令

(1)5种指令:逻辑与、或、非、异或和测试指令。 (2)指令格式

① 逻辑与指令AND OPRD1,OPRD2; (OPRD1)←(OPRD1)∧(OPRD2)

② 逻辑或指令OR OPRD1,OPRD2;

(OPRD1)←(OPRD1)∨(OPRD2 )

③ 逻辑非指令 NOT OPRD;

(OPRD)← (/OPRD) ④ 逻辑异或指令XOR OPRD1,OPRD2;(OPRD1)←(OPRD1)⊕(OPRD2) ⑤ 测试指令TEST OPRD1,OPRD2 ;

(OPRD1)∧( OPRD2 ) ,结果不回送。 (3)操作数范围

源操作数为reg 、mem、data;目的操作数为reg 、mem(NOT指令只有一个操作数)。单操作数指令NOT的操作数不能为立即数。双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。

(4)功能:实现相应的逻辑功能。

① 与指令可实现屏蔽(复位)数据的某些位(使一个字或字节中的某些位清0,而其余位不变),提取某些位或拆字。

② 或指令可实现置位数据的某些位(使一个字或字节中的某些位置1,而其余位不变),拼字。

③ 非指令常用于使某个数取反,或取反后+1而得补码。

④ 异或指令可实现某个寄存器清0,或使目的操作数的某些位取反(使一个字或字节中的某些位取反,而其余位不变)。

⑤ 测试指令通常用于测试。目的操作数的某些位是1还是0,用ZF标志判断。

4 (5)对标志位的影响

① 逻辑与、或、异或和测试指令影响ZF,PF,SF标志;CF=0,OF=0;AF无意义。 ② 逻辑非指令不影响标志位。 2. 移位指令

(1)4组8种指令:算术移位SA,逻辑移位SH,循环移位RO,带进位位的循环移位RC。右移R,左移L。

(2)指令格式:操作码 OPRD,M M =1时,只移1位; M>1时,可将指令格式中的CNT改为CL寄存器,并在移位指令前将移位次数预先送入CL寄存器中。

(3)功能:将OPRD的内容移位M次。算术移位适用于带符号数的×2,÷2。逻辑移位适用于无符号数的×2,÷2。

(4)操作数范围: reg、mem。

(5)对标志位的影响:

① 算术/逻辑移位指令影响CF、SF、ZF、PF标志,在移1位时,影响OF标志。不影响AF标志。

② 循环移位指令只影响CF、 OF标志,不影响其他标志位。

CF MSB LSB 0 SHL/SAL算术/逻辑左移 CF 0 CF MSB LSB SHR逻辑右移 MSB LSB SAR算术右移

CF MSB LSB ROL循环左移 CF MSB LSB ROR循环右移 CF MSB LSB RCL通过进位的循环左移 CF MSB LSB RCR通过进位的循环右移

四、串操作类指令

(1)5种指令:串传送MOVS,串比较CMPS,串搜索SCAS,存串STOS,取串LODS。 (2)指令格式:操作码

DST,SRC MOVSB(字节)/MOVSW(字)

① 串传送MOVS DST,SRC;[(ES:DST)]←[(DS:SRC )]

MOVSB;

[(ES:DI)]←[(DS:SI)],SI=SI±1,DI=DI±1

MOVSW;

[(ES:DI)]←[(DS:SI)],[(ES:DI+1)]←[(DS:SI+1)],SI=SI±2,DI=DI±2

② 串比较CMPS DST,SRC;

[(ES:DI)]-[(DS:SI)];SI=SI±1,DI=DI±1

5 ③ 串搜索SCAS DST;

AL← [(ES:DI)]];DI=DI±1 ④ 存串STOS DST;

[(ES:DI)] ← AL;DI=DI±1 ⑤ 取串LODS SRC;

AL ←[(DS:SI)];SI=SI±1 字操作与字节操作类似,AL——AX。 (3)功能

根据方向标志DF及所传送数据的类型(字节/字)对SI及DI进行修改,在指令重复前缀REP的控制下实现。

① 串传送:把数据段中由SI间接寻址的一个字节/字传送到附加段中由DI间接寻址的一个字节/字单元中。

② 串比较:把数据段中由SI间接寻址的一个字节/字与附加段中由DI间接寻址的一个字节/字进行比较操作,使比较的结果影响标志位。可在两个数据串中寻找第一个不相等的字节/字,或者第一个相等的字节/字。

③ 串搜索:用指令指定的关键字节/字(分别存放在AL/AX中),与附加段中由DI间接寻址的字节串中的一个字节进行比较操作,使比较的结果影响标志位。可在指定的数据串中搜索第一个与关键字节匹配(或者不匹配)的字节。

④ 存串:把指令中指定的字节(或字)串(存放在AL/AX中) 传送到附加段中由DI间接寻址的字节内存单元中。可连续将AL(或AX)的内容存入到附加段中的一段内存区域中去,该指令不影标志位。

⑤ 取串:从串中取指令实现从指定的字节(或字)串中读出信息的操作。 (4)规定

① 串操作类指令是唯一的一组源和目的操作数均在存储单元的指令。 源串在数据段,目的串在附加段。各指令所使用的默认寄存器是:源串地址DS:SI;目的串地址ES:DI;字串长度CX;存取或搜索的默认值

AL

② 串操作时,地址的修改由方向标志确定。

CLD;DF=0,SI/DI地址作自动增量(自动+1)修改; STD;DF=1,SI/DI地址作自动减量(自动-1)修改。

③ 任何一个串操作指令均可在指令前面加上一个重复操作作为前缀,于是就重复执行,直至CX、ZF满足要求为止。

④ 重复指令前缀

REP;①若(CX)=0,则退出; ② CX=CX-1;③执行后续指令;④重复①----③

REPE/REPZ;①若(CX)=0或ZF=0,则退出;②CX=CX-1;③执行后续指令;④重复①----③ REPNE/REPNZ;①若(CX)=0或ZF=1,则退出;②CX=CX-1;③执行后续指令;④重复①----③

五、控制转移类指令——改变指令执行顺序的指令

(1)6种指令:无条件转移指令、子程序调用和返回指令、条件转移指令、循环控制指令、中断指令、处理器控制命令。

(2)概念

①直接转移:转移的目的地址(标号)直接出现在指令码中。

②间接转移:转移的目的地址间接存储于某一个寄存器或某一个内存变量中。

③段内转移/调用:转移的目的地址和本条指令在同一代码段中,转移时只改变IP,不改变CS。程序转向的有效地址EA等于当前IP的内容加上8/16位位移量。可分为:

段内近转移NEAR ——16位位移量,适用于无条件转移指令和条件转移指令,转移范围为-32768 ---- +32768。

段内短转移SHORT ——8位位移量,适用于条件转移指令,转移范围为-128 ---- +127 。

6 ④段间转移/调用(远转移FAR):转移的目的地址和本条指令不在同一代码段中,转移时同时改变CS和IP内容,即程序转移到另一个代码段。

1. 无条件转移指令

JMP [转移方式]OPRD;转移到OPRD所指向的存储器单元处执行程序 (1)段内直接短转移指令JMP SHORT OPRD;(IP)← (IP)+ OPRD

(2)段内直接近转移指令JMP

NEAR PTR

OPRD;(IP)← (IP)+ OPRD (3)段内间接转移指令JMP WORD PTR

OPRD;(IP)← [EA] (4)段间直接(远)转移指令JMP FAR PTR OPRD;(IP)←OPRD的段内偏移地址,(CS)←OPRD所在的段地址。OPRD为直接寻址方式。

(5)段间间接转移指令JMP DWORD PTR OPRD;(IP)← [EA],(CS)← [EA+2] 2. 条件转移指令

指令助记符

目的地址

(1)标志条件转移指令助记符:J/JN+标志(C, P, S, S, O);

(2)比较条件转移指令助记符:J/JN+比较符(A高于, B低于, E等于, G大于, L小于) (3)无符号数比较:测试标志位为CF、ZF,分高于A、等于E、低于B等3种情况:ZF=1,等于;CF=0,大于。

(4)符号数比较:测试标志位为ZF、OF和SF,分大于G、等于E、小于L等3种情况:ZF=1,等于;SF⊕OF =0,大于。

3. 子程序调用和返回指令 (1)子程序(过程)调用指令

CALL 子程序名 DST ①段内调用: CALL NEAR PTR OPRD ;(SP)←(SP)-2,((SP)-2)((SP)-1) ← (IP),

(IP)←子程序DST的地址( 即:IP+16位位移)

②段间调用:CALL FAR PTR OPRD ;(SP)←(SP)-2 ,((SP)-2)((SP)-1)= ( CS ),

(SP)←(SP)-2 ,((SP)-2)((SP)-1)=( IP ),

(IP)=[EA],(CS)=[EA+2] (2)子程序返回指令

RET;段内返回( IP ) ← ((SP) +1 ,SP),( SP ) ←

( SP) + 2

;段间返回( IP ) ← ((SP) +1 ,SP),( SP ) ←

( SP) + 2

( CS ) ← ((SP) +1 ,SP),( SP ) ←

( SP) + 2 4. 循环控制指令

对CX或标志位ZF进行测试,确定是否循环。 (1)LOOP OPRD(短标号);(CX)← (CX)-1,若CX≠ 0,则循环,否则顺序执行。

(2)LOOPNZ/LOOPNE OPRD;(CX)←(CX)-1,若CX≠0和ZF=0,则循环,否则顺序执行。 (3) LOOPZ/LOOPE OPRD;(CX)←(CX)-1 ,若CX≠0 和ZF=1,则循环,否则顺序执行。 (4)JCXZ OPRD; (CX)← (CX)-1 ,若CX=0,则循环,否则顺序执行。 5. 中断指令 (1)INT n;(SP)←(SP)-2,((SP)-2 )((SP)-1 )←(FR), FR入栈

;(SP)←(SP)-2 ,((SP)-2 )((SP)-1 )←(CS), CS入栈 ;(SP)←(SP)-2 ,((SP)-2) ((SP)-1 )←(IP), IP入栈 ;(IP)←(n×4), (CS)←(n×4+2),n——中断类型号

(2)INTO;同INT 4,算术运算溢出中断指令

(3)中断返回指令IRET;(IP) ← ((SP)+1 ,(SP)), (SP) ← (SP)+2, IP出栈

;(CS)← ((SP)+1 ,(SP)), (SP) ← (SP)+2, CS出栈

;(FR)← ((SP)+1 ,(SP)), (SP) ← (SP)+2, FR出栈

6. 处理器控制命令 (1)标志操作指令

清标志位为CL,置标志位为ST。只对CF、DF和IF三个标志操作 CLC——清进位标志,CLD——清方向标志,CLI——关中断标志; STC——置进位标志, STD——置方向标志,STI——开中断标志; CMC——进位标志取反。 (2)处理器外部同步命令

对标志位的影响:不影响标志位 。

①暂停指令:HLT;处理器处于什么也不做的暂停状态,可由中断请求、复位等唤醒继续执行。 ②等待指令:WAIT;处理器处于等待状态,CPU每隔4个时钟周期测试一次TEST引脚线(23脚),直至TEST引脚线为有效低电平时,CPU才脱离等待状态。 ③交权指令:ESC;CPU将控制权交给其他协处理器,使协处理器从系统指令流中取得指令。

④总线封锁指令:LOCK;可放在任一条指令前作为前缀,使CPU在执行下一条指令期间发出总线封锁信号(LOCK),将总线封锁,其它的主设备不能控制总线。

⑤空操作指令:NOP;不完成任何操作,只耗费3个时钟周期,用于程序的延时和调试。

上一篇:网络工程师的岗位职责下一篇:物理骨干教师工作总结

本站热搜