微机原理程序
微机原理-常用指令用法
微机原理-常⽤指令⽤法序号指令功能和特点例程1 例程2 例程3 1 MOV 参与传送的操作数有:通⽤寄存器,段寄存器,存储单元,⽴即数四类。
有有互相之间只要不违背以下原则即可进⾏传送:1.源,⽬的操作数长度⼀致2.源,⽬的操作数不能同为存储单元3.CS不能作为⽬的操作数4.段寄存器只能通过通⽤寄存器或存储单元进⾏赋值。
5.⽴即数不能作为⽬的操作数。
2 PUSH ⼀定是字操作(不能PUSH字节)有PUSH AX,PUSH DS,PUSH [0000H] ;【POP对等】SP <‐ SP‐2,字存⼊SP指向的地址(⾼位在⾼地址)操作数可以为通⽤寄存器,段寄存器或存储单元,CS可PUSH不可POP3 POP 与PUSH对等4 XCHG Xchg dst,src可在通⽤寄存器间,通⽤寄存器和存储单元间进⾏。
不能⽤段寄存器和⽴即数。
XCHG [1200H],DXXCHG AL,CL5 XLAT 直接写出XLAT就⾏,在调⽤该指令前,需将BX初始化为数据表的⾸地址,AL初始化为希望取得的数据在数据表中的序号。
在调⽤该指令后,AL中的内容被赋值为DS:[BX][AL]的内容。
6 LEA LEA BX,1000H[SI],执⾏后BX = SI+1000H有LEA BX,TABLEMOV BX,OFFSET TABLE,以上两条等价7 LDS 指针送寄存器和DS指令LDS dst,src将SRC指定的连续4个存储单元的内容传送到DS和DST指向的寄存器,⾼字送到DS,低字送到DST假设DS=3200H,(33550H)=3A78H,(33552H)=1998HLDS SI,[1550H]后,SI = 3A78H,DS = 1998H8 LES 类同LDS,不同的是DS改成了ES9 SAHF 将AH的内容送标志寄存器的低8位10 LAHF 把标志寄存器的低8位送⼊AH11 PUSHF 将16位标志寄存器内容压⼊堆栈12 POPF 从堆栈弹出字数据送⼈标志寄存器13 ADD Dst可以为存储单元或通⽤寄存器有 Src可为存储单元,通⽤寄存器或⽴即数,不能同时为存储单元Add ax,1234hAdd [1234h],ax14 ADC Adc dst,srcDst = dst+src+cf15 INC Inc dstDst为通⽤寄存器或存储单元影响OF,SF,ZF,AF,PF,但不影响CF。
微机原理微型计算机的程序设计
2024/9/30
43
例6.2
将内存(10050)单元旳内容拆成两段,每段4位,并将它 们分别 存入内存(10051)和(10052)单元。即(10050) 单 元 中 旳 低 4 位 放 入 ( 10051 ) 单 元 中 旳 低 4 位 , 而 (10050)单元中旳高4位放入(10052)单元中旳低4位。
INT 21H
2024/9/30
42
作业8.17 编写求输入算式’加数1+加数2’旳和并送显。
(加数及其和均为4位(即指压缩)BCD数,P262)
分析:要求先有屏幕显示输出‘加数1+加 数2:’,然后从键盘输入两个4个字节旳 BCD数,加完后送显。
用到旳变量:W1和W2因为从键盘输入,均 不拟定是几位十进制,故需拟定其最大位 数不超出要用
2024/9/30
12
MOV AX, W1
;AX=0809H,W2为0607H
ADD AL, BYTE PTR W2 ;AL=10H, CF=0,AF=1
AAA ; 属于第一种情况,故
; AL为(AL+06H)&0FH=10H+06H )&0FH
;
=16H&0FH=06H=AL;
;AH加1且CF置CF=1,所以AH=08H+1=09H,则AX=0906H
2024/9/30
34
2024/9/30
35
2024/9/30
36
2024/9/30
37
2024/9/30
38
作业8.4 编写求两个4位非压缩BCD数之和,
将和送显示屏显示旳程序。(P261)
分析:两加数各要4个字节单元,可觉得DD 类型;考虑到进位,和要5个字节单元,另 外,输出到显示器旳结束符号’$’需要一 个单元存放,故共需6个字节。 所以,数据段定义为:
微机原理软件实验报告
实验名称:汇编语言程序设计实验日期:2023年3月10日实验地点:计算机实验室实验者:张三一、实验目的1. 熟悉汇编语言的基本语法和指令系统。
2. 掌握汇编语言程序设计的基本方法。
3. 通过实验,加深对微机原理的理解。
二、实验内容本次实验主要涉及以下内容:1. 数据传送指令的应用2. 算术运算指令的应用3. 控制转移指令的应用4. 子程序设计三、实验步骤1. 编写一个简单的程序,实现以下功能:(1)将数据0x1234存入寄存器AX;(2)将数据0x5678存入寄存器BX;(3)计算AX和BX的乘积,并将结果存入寄存器DX;(4)将乘积的高16位和低16位分别存入寄存器CX和AX。
2. 编写一个程序,实现以下功能:(1)将数据0x1A2B3C4D存入内存单元[0x1000];(2)从内存单元[0x1000]开始,读取连续4个字节的数据;3. 编写一个程序,实现以下功能:(1)定义一个子程序,实现两个整数的加法运算;(2)在主程序中调用该子程序,实现两个整数的加法运算。
四、实验结果与分析1. 数据传送指令的应用(1)将数据0x1234存入寄存器AX;MOV AX, 0x1234(2)将数据0x5678存入寄存器BX;MOV BX, 0x5678(3)计算AX和BX的乘积,并将结果存入寄存器DX;MUL BX(4)将乘积的高16位和低16位分别存入寄存器CX和AX; MOV CX, DXMOV AX, DX2. 算术运算指令的应用(1)将数据0x1A2B3C4D存入内存单元[0x1000];MOV [0x1000], 0x1A2B3C4D(2)从内存单元[0x1000]开始,读取连续4个字节的数据; MOV AX, [0x1000]MOV BX, [0x1000+2]MOV CX, [0x1000+4]MOV DX, [0x1000+6]MOV AH, 0x0EINT 0x103. 控制转移指令的应用(1)定义一个子程序,实现两个整数的加法运算;ADD procedure:ADD AX, BXRET(2)在主程序中调用该子程序,实现两个整数的加法运算;MOV AX, 0x1MOV BX, 0x2CALL ADDMOV CX, AX五、实验心得通过本次实验,我深刻理解了汇编语言的基本语法和指令系统,掌握了汇编语言程序设计的基本方法。
微机原理加法及判断程序的编写调试实验
1 当 x>0
y=
0 当 x=0
-1 当 x<0
二、实验目的和要求
实验目的 1、写汇编语言程序的基本方法和基本框架。 2、学会编写顺序结构、分支结构和循环结构的汇编程序。 3、掌握程序中数据的产生与输入输出的方法。 三、实验要求 1、实验前准备 (1)分析题目,将程序中的原始数据、中间结果和最终结果的存取方式确定好。 (2)写出算法或画出流程图。 (3)写出源程序。 (4)对程序中结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。 2、本实验要求在 PC 机上进行。
四、 实验设备(软、硬件)
1、 IBM PC 和(PC/XT、AT、286、386、486)
2、 H-86/51 通用微机实验培养装置
五、 仪器使用说明
1、在 EDIT 中输入原程序,即生成 .asm 文件。 2、汇编.asm 文件
C:\WINDOWS\DESKTOP\BH-86>masm Source filename [.ASM]: E1 Object filename [E1.BOJ]: E1 Source listing [NUL.LST]: E1 Cross—reference[NUL.CRF]: E1
九、 参考资料
1、《微型计算机系统原理及应用-第四版》,周明德编著,清华大学出版社,2002 年。 2、《微型机接口技术》,王承发、刘岩主编,高等教育出版社,1998 年 3、《IBM PC 宏汇编语言程序设计》,张怀莲编,电子工业出版社,1989 年
十、思考题
程序中的原始数据是以怎样的形式存放在数据区中?请用 DEBUG 调试程序进行观察,
(5)、用 T 命令做单步跟踪执行程序。
附:DOS 调用程序
1、在显示器上显示一个字符 调用 02H 功能调用号,发 21H 号中断,将要显示的字符的 ASCII 码送入 DL,
微机原理实验讲义(电子14级)
第一部分汇编语言程序设计实验一汇编语言程序设计基础[实验目的]1.学习和掌握汇编语言程序的基本结构和上机过程。
2.学习和掌握顺序程序设计的方法3.学习和掌握汇编语言程序的调试方法。
4.学习EMU8086和MASM FOR WINDOWS软件的使用。
[实验要求]1、上机前要做好充分准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。
2、上机时要遵守实验室的规章制度,爱护实验设备。
要熟悉与试验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序)的使用方法。
在程序的调试过程中,有意识的学习及掌握程序的各种操作命令以便掌握程序的调试方法及技巧。
[实验器材]微型计算机、WINDOWS操作系统、DOS系统、DEBUG程序、MASM 5.0[实验内容]1.编写程序,在屏幕上分行显示自己的姓名、学号和欢迎信息,每个信息显示在不同的行。
2.编写程序,通过键盘输入0——9之间的一个数字,利用查表法计算其平方。
3.在数据段定义x、y、res1、res2、res3、res4,分别计算x和y的和、差、积、商,分别存放在变量res1、res2、res3、res4中,变换不同的x和y的值,进行计算,分析和记录计算结果以及相关标志位的状态。
验证程序是否正确。
4.在数据段定义x、y、res1、res2、res3、res4,分别计算x和y的与、或、非、异或的结果,分别存放在变量res1、res2、res3、res4中,变换不同的x和y的值,进行计算,分析和记录计算结果以及相关标志位的状态。
验证程序是否正确。
5.将字节型变量x和y交换。
[实验步骤]1.编辑源程序。
(注意:保存文件时文件的扩展名必须为.asm,最好将文件保存在自己的文件夹下)。
2.汇编源程序,应用MASM.EXE对源程序进行汇编,生成.obj的目标文件和.lst的列表文件,通过列表文件查看并记录其中一个程序的目标代码。
3.连接目标程序,应用LINK.EXE对目标模块进行连接,生成 .EXE的可执行文件,执行可执行文件,验证程序功能。
微机原理实验参考程序
T1a.asm;4000H起256个字节清0Block equ 4000hmov dptr, #Block ; 起始地址mov r0, #0 ; 清 256 字节clr aLoop: movx @dptr, ainc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一ljmp $endT1a.c;4000H起256个字节清0xdata unsigned char Buffer[256] _at_ 0x4000; void main(){unsigned int index;unsigned char xdata * ptr;ptr = &Buffer; // 起始地址for (index = 0; index <= 255; index++) {*ptr++ = 0; // 清0, 地址加一}}T1b.asm;3000H起长度256字节的存储块移到4000Hmov r0, #30hmov r1, #00hmov r2, #40hmov r3, #00hmov r7, #0Loop: mov dph, r0mov dpl, r1movx a, @dptrmov dph, r2mov dpl, r3movx @dptr, acjne r1, #0ffh, Goon1inc r0Goon1: inc r1cjne r3, #0ffh, Goon2inc r2Goon2:inc r3djnz r7, Loopljmp $endT1b.c;3000H起长度256字节的存储块移到4000Hxdata unsigned char Buffer1[256] _at_ 0x3000;xdata unsigned char Buffer2[256] _at_ 0x4000;void main(){unsigned int index;unsigned char xdata * ptr1;unsigned char xdata * ptr2;ptr1 = &Buffer1;ptr2 = &Buffer2;for (index=0; index <= 255; index++) {*ptr2++ = *ptr1++;}}T2.ASM 8255输入输出实验mode equ 082h ; 方式0,PA,PC输出,PB输入1000,0010 PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址org 0hmov a, #modemov dptr, #CAddrmovx @dptr,a ; 输出控制字;实验1:PA口作输出,驱动LED,实现单个LED循环点亮。
微机原理实验程序 中国石油大学(华东)
实验3 循环程序设计实验内容:1.数组X,Y,Z,。
X=32,-43,76,95,-1;Y=-78,127,-128,-125,88。
计算两数之和,送入数组S。
DATA SEGMENTX DB 32,-43,76,95,-1Y DB -78,127,-128,-125,88S DB 5 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX ,DATAMOV DS,AXMOV CX,5MOV SI,0FOR:MOV AL,X[SI]ADD AL,Y[SI]MOV S[SI],ALINC SILOOP FORCODE ENDSEND START2.两个多位十进制数,X=1357902468,Y=5790123467。
计算两数之和(BCD码)。
DATA SEGMENTX DB 68H,24H,90H,57H,13HY DB 67H,34H,12H,90H,57HS DB 5 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX ,DATAMOV DS,AXMOV CX,5MOV SI,0CLCFOR:MOV AL,X[SI]ADD AL,Y[SI]DAAMOV S[SI],ALINC SILOOP FORCODE ENDSEND START实验4 子程序调用变成设计实验内容:用子程序调用方法,现有数组X=32,-43,76,95,-1,-78,127,-128,-125,88 编程按递增顺序排序输出。
DATA SEGMENTX DB 32,-43,76,95,-1,-78,127,-128,-125,88ENDS SEGMENTCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX ,DATAMOV DS,AXCALL SUB1MOV AH,4CHINT 21HSUB1 PROC NEARMOV CX,9LP1:MOV BX,0MOV DX,CXLP2;MOV AL,X[BX]CMP AL,X[BX+1]JLE NEXTXCHG AL,X[BX+1]NEXT:INC BXDEC DXJNE LP2LOOP LP1RETSUB1 ENDPCODE ENDSEND START实验5 DOS功能调用实验内容:1.从键盘连续输入五个单个字符,然后再反向输出这5个字符。
微机原理必备程序段
1.数据传送:问题描述:设在DS=3000H,偏移地址为0100H的内存中顺序存放着100个字节的数据。
要求传送到以2000H为起始偏移地址的区域。
代码:利用寄存器间接寻址来寻找操作数可以编程如下:mov ax,3000hmov ds,ax ;建立数据段mov si,0100h ;建立源数据指针mov di,2000h ;建立目的地指针mov cx,100 ;设置计数器nt:mov al,[si] ;取数mov [di],al ;送数inc si ;调整指针inc didec cx ;计数器减1jne nt ;CX-1≠0转nt 标号另一种方法:提示:若将倒数第2、3行用 REP MOVSB代替,则可进一步简化。
MOV AX,3000HMOV DS,AXMOV ES,AXMOV SI,0100HMOV DI,0200HMOV CX,100CLDNT:MOVSBLOOP NTINT 20H2.多字节的加法:问题描述:有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后。
运算后,得到的和放在2000H开始的内存单元中。
代码:MOV SI,2000H ;取第一个数的首地址MOV AX,[SI] ;将第一个数的低16位取到AXMOV DI,3000H ;取第二个数的首地址ADD AX,[DI] ;两个数的低16位相加。
MOV [SI],AX ;低16位相加的结果送到2000H和2001H单元MOV AX,[SI+2] ;取第一个数的高16位送到AX中ADC AX,[DI+2] ;两个数的高16位连同CF相加MOV [SI+2],AX ;高16位相加的结果送到2002H,2003H单元。
3.多字节组合BCD码十进制加法问题描述:设第一个数据在1000H开始的8个内存单元中,第二个数据在2000H开始的8个内存单元中,要求相加之后将结果放在2000H开始的内存区域。
《单片微机原理及应用》实验参考程序(32页)
《单片微机原理及应用》实验参考程序杭州电子科技大学电子信息学院张学超编写(使用达爱思Dais-80958B单片机实验开发系统)一、软件实验参考程序软件实验一清零程序Array ;将2000H-20FFH的内容清零SS01: CLR AMOV DPTR, #2000HMOV R7, #0FFHCLR0: MOVX @DPTR,AINC DPTRDJNZ R7, CLR0CLR1: SJMP CLR1 ; SJMP $软件实验二拆字程序;把2000H的内容拆开,高4位送2001H的低4位,低4位清零。
SS02: MOV DPTR, #2000HMOVX A, @DPTR ;取数MOV B, A ;暂存该数SW AP A ;高低半字节交换ANL A, #0FH ;屏蔽高4位INC DPTRMOVX @DPTR,A ;原数高半字节送2001HMOV A, B ;取回原数ANL A, #0FH ;屏蔽高4位INC DPTRMOVX @DPTR,A ;原数低半字节送2002HSJMP $软件实验三拼字程序;把2000H和2001H的低4位分别送入2002H的高低4位。
SS03: MOV DPTR, #2000HMOVX A, @DPTR ;取第一个半字节ANL A, #0FH ;屏蔽高4位SW AP A ;高低半字节交换MOV B, A ;暂存该数INC DPTRMOVX A, @DPTR,;取第二个半字节ANL A, #0FH ;屏蔽高4位ORL A, B ;两个半字节拼成一个字INC DPTRMOVX @DPTR,A ; 拼好的字送2002HSJMP $软件实验四数据区传送子程序;把R2R3为源RAM区首址内的R6R7字节数据传送到R4R5为目的RAM区。
SS04: MOV DPH, R2MOV DPL, R3 ;取源地址指针MOVX A, @DPTR ;取数据INC DPTR ;源地址指针+1MOV R2, DPHMOV R3, DPL ;保存源地址指针MOV DPH, R4MOV DPL, R5 ;取目的地址指针MOVX @DPTR, A ;存数据INC DPTR ;目的地址指针+1MOV R2, DPHMOV R3, DPL ;保存目的地址指针CLR CMOV A, R7SUBB A, #1MOV R7, AMOV B, A ;暂存16位字节数低字节MOV A, R6SUBB A, #0MOV R6, A ;字节数减一:(R6R7)← (R6R7)−1ORL A, B ;(R6R7)=0?JNZ SS04 ;未完继续传送RETSS04C: MOV R3, #00HMOV R2, #20H ;指定源地址为MOV R5, #00HMOV R4, #30H ;指定目的地址为3000HMOV R7, #00HMOV R6, #01H ;传送字节数为100HLCALL SS04 ;从2000H开始向3000H开始的地址区传送100H个数据SJMP $软件实验五数据排序实验;把8051中RAM 50H-5AH中放入不等的数据,运行本实验程序后检查50-5AH中内容是否按从小到大排列。
微机原理十进制减法实验程序
微机原理十进制减法实验程序一、十进制数相减程序设计实验DATA SEGMENTDATA1 DB 33H,39H,31H,37H,38H ;第一个数据(作为被减数)DATA2 DB 36H,35H,30H,38H,32H ;第二个数据(作为减数)MES1 DB '-','$'MES2 DB '=','$'DATA ENDSSTACK SEGMENT ;堆栈段STA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV SI,OFFSET DATA1MOV BX,05CALL DISPL ;显示被减数MOV AH,09HLEA DX,MES1INT 21HMOV SI,OFFSET DATA2MOV BX,05 ;显示减数CALL DISPLMOV AH,09HLEA DX,MES2INT 21HMOV SI,OFFSET DATA1MOV DI,OFFSET DATA2CALL SUBA ;减法运算MOV SI,OFFSET DATA1MOV BX,05 ;显示结果CALL DISPLMOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21HINT 21HMOV AX,4C00HINT 21HDISPL PROC NEAR ;显示子功能DSI: MOV AH,02MOV DL,[SI+BX-1] ;显示字符串中一字符INT 21HDEC BX ;修改偏移量JNZ DSIRETDISPL ENDPSUBA PROC NEARMOV DX,SIMOV BP,DIMOV BX,05SU1: SUB BYTE PTR[SI+BX-1],30HSUB BYTE PTR[DI+BX-1],30HDEC BX ;将ASCII 码表示的数字串 JNZ SU1 ;转化为十六进制的数字串 MOV SI,DXMOV DI,BPMOV CX,05 ;包括进位,共5位CLC ;清进单位SU2: MOV AL,[SI]MOV BL,[DI]SBB AL,BL ;带进位相减AAS ;非组合BCD码的减法调整 MOV [SI],AL ;结果送被减数区INC SIINC DI ;指向下一位LOOP SU2 ;循环MOV SI,DXMOV DI,BPMOV BX,05SU3: ADD BYTE PTR [SI+BX-1],30HADD BYTE PTR [DI+BX-1],30HDEC BX ;十六进制的数字串转化ASCII码表示的数字串 JNZ SU3 RETSUBA ENDPCODE ENDSEND START二、十进制数排序程序设计实验;;;;;功能:冒泡排序服务程序;;;;;;DATA SEGMENTWORD DB 'Input numbers:',0DH,0AH,'$'BUF DB 100 DUP('$')DATA1 DB 0DH,0AH,'The result is:',0DH,0AH,'$' COUNT DB 0 DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:;;;;;;;;;;;;;;初始化;;;;;;;;;;;;;MOV AX,DATAMOV DS,AXLEA DX,WORDMOV AH,09HINT 21HLEA DX,BUFMOV AH,0AH ;输入字符到缓冲区INT 21H ;输入数据(0~99),每个数据空格隔开;;;;;;功能:计算键入数字个数;;;;;;;;;;;;;H1: MOV AL,DI[BUF+2]CMP AL,' ' ;是否为空格JNZ H2INC [COUNT] ;有数字,数量+1JMP H3H2: CMP AL,0DH ;是否为CRJZ H4H3: INC DIJMP H1H4: INC [COUNT];存放需要比较的个数;;;;;;;功能:冒泡排序服务程序;;;;;;;;;;;;; MOV CX,0MOV CL,BYTE PTR [COUNT];循环次数L1: PUSH CXMOV CL,BYTE PTR [COUNT]MOV DI,0;取首位数据L4: CALL COUNT1;调用判断数据位数子程序CMP BL,DL;比较位数的大小JA L5;前一个数比后一个数大的情况JNE L6CMP BL,1JNZ L7CALL XCH3;同为一位数的比较JMP L5L7: CALL XCH2;同为两位数的比较JMP L5L6: CALL XCH1;前一个数比后一个数位数少的情况L5: LOOP L4POP CXLOOP L1;;;;;;;;显示排序结果;;;;;;;;;;DISPLAY:LEA DX,[DATA1]MOV AH,09HINT 21H;显示提示信息LEA DX,[BUF+2]MOV AH,09HINT 21H;显示结果MOV AH,4CHINT 21H;返回结束;;;;;;;;判断数据位数;;;;;;;;;;COUNT1:MOV DX,0MOV BX,0J1: MOV AL,DI[BUF+2]CMP AL,' 'JZ J2CMP AL,0DHJZ J3INC BLINC DIJMP J1J2: MOV AL,DI[BUF+3]CMP AL,' 'JZ J3CMP AL,0DHJZ J3INC DLINC DIJMP J2J3: SUB DI,DXINC DIRET;;;前一个数比后一个数位数少的情况;;XCH1:MOV AL,DI[BUF] ;第一个数装入ALMOV BX,WORD PTR DI[BUF+2] ;第二个数装入BX MOV WORD PTR DI[BUF],BXMOV BL,20HMOV DI[BUF+2],BLMOV DI[BUF+3],ALINC DIRET;;;;;;;;;;同为两位数比较;;;;;;;;;XCH2:MOV BX,WORD PTR DI[BUF-1] ;第一个数装入BX MOVDX,WORD PTR DI[BUF+2] ;第二个数装入DX CMP BX,DX JAE L9 ;>=不交换MOV WORD PTR DI[BUF-1],DXMOV WORD PTR DI[BUF+2],BXL9: RET;;;;;;;;;;同为一位数的比较;;;;;;;;XCH3:MOV DL,DI[BUF] ;第一个数装入DLMOV DH,DI[BUF+2];第二个数装入DHCMP DL,DHJAE L10 ;>=不交换MOV DI[BUF],DHMOV DI[BUF+2],DLL10: RETCODE ENDSEND START三、8255输入输出实验;//***************************************************** ;文件名: 8255IO for 8088;功能: 8255输入、输出实验;接线: 用导线连接8255模块的CS_8255到CPU模块的200H;; 8255模块的JD3C到八位逻辑电平输出模块的JD1E。
微机原理实验指导书 (1)
实验一系统操作及程序调试举例1.实验目的学习并掌握实验系统的基本操作,为以后的实验打下基础。
2.实验设备DICE-8086B实验系统一台3.实验准备工作系统一经连好,检查无误后,就可以通电运行。
系统提供两种启动方式,即:系统自动完成后,显示器上会显示“>”提示符,等待键入操作命令。
4.实验内容及步骤(1)系统操作练习(一)要求:从3500内存单元开始建立0~15共16个数据。
程序流程图如下:实验步骤①输入与修改:在“﹥”提示符下键入A2000,此时显示器上将会显示程序的段地址CS和偏移地址IP(=2000H),接着就可以在光标处输入程序。
注:在输入过程中,若发现本行有错误,则可以按“ ”键删除并重新输入;若回车后系统提示“ERROR!”,则要在原地址指针处重新正确输入。
输入程序后可通过反汇编查看程序。
(U操作)②程序运行:在DICE-8086B实验系统上,程序的运行方式有单步、连续和断点运行几种方式。
可参考(T操作,G操作,GB操作等)③内存单元的修改与显示:用(D操作)可显示内存单元的内容,用(E操作)可修改内存单元的内容。
(分别参考前)。
④运行程序观察从3500H单元开始连续存放的16个数据为多少?任意修改AX的值,再运行程序,显示运行结果是否正确?流程图及参考程序如下:地址机器码助记符注释2000 BF 3500 MOV DI,3500 ;设数据区首址2003 B9 0010 MOV CX,0010 ;字节数送CX2006 B8 0000 MOV AX,00002009 9E SAHF200A 88 05 MOV B[DI],AL ;写入一字节200C 47 INC DI ;修改地址指针200D 40 INC AX ;修改数据200E 27 DAA ;十进制调整200F E2 F9 LOOP 200A ;未填完转移2011 CD 00 INT(2)系统操作练习(二)要求:将内存3500单元开始的0~15共16个数传递到3600单元开始的数据区中。
微机原理与汇编语言程序设计实验一
实验一汇编语言上机环境及基本操作一、实验目的及要求1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。
2.学会使用EDIT、MASM、LINK、DEBUG等软件工具。
3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。
二、实验内容1.汇编语言源程序的建立本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。
设定源程序的文件名为ABC。
DATA SEGMENTBUF DB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,7FHCN EQU $-BUFDATA ENDSSTACK SEGMENT STACK ’STACK’STA DB 10 DUP(?)TOP EQU $-STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: PUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET BUFMOV CX,CNDEC CXMOV AL,[BX]INC BXLP: CMP AL,[BX]JBE NEXTMOV AL,[BX]NEXT: INC BXDEC CXJNZ LPMOV AH,4CHINT 21HCODE ENDSEND START键入以下命令:C:\>EDIT ABC.ASM此时屏幕的显示状态如图1所示。
图1 用EDIT编辑ABC.AS M程序窗口程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。
2.将源程序文件汇编成目标程序文件一般情况下,MASM汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。
(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。
(3)若程序中使用了宏指令,则汇编程序将展开宏指令。
微机原理课程设计_进制转换程序设计
课程设计任务书学生姓名:易杨专业班级:电信 0802 指导教师:曾刚工作单位:信息工程学院题目:进制转换程序设计初始条件:具备数字电路的理论知识;具备微机原理的理论知识和实践能力;熟悉汇编语言编程技术;熟悉80X86的CPU结构和指令系统;熟悉相关常用接口电路的设计使用方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、程序实现二进制、十进制、十六进制之间的转换2、在命令提示下输入相应进制数,回车后进行转换3、输入错误时应声响报警并拒绝输入4、程序采用汇编语言在PC机上完成5、完成符合学校要求的设计说明书时间安排:一周,其中2天程序设计,2天程序调试,1天完成课程设计报告书及答辩指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (I)1原理分析 (1)2程序设计流程 (3)2.1程序流程图 (3)2.2设计思路 (4)3程序设计 (5)3.1堆栈段数据段程序设计 (5)3.2主程序设计 (5)3.3输入二进制程序 (7)3.4输入十进制程序 (8)3.5输入十六进制程序 (8)3.6输出二进制程序 (9)3.7输出十进制程序 (9)3.8输出十六进制程序 (11)3.9回车键确定程序 (11)3.10报警程序 (12)4运行结果 (13)5心得体会 (15)参考文献 (16)摘要日常生活与实际应用中,往往需要计算机处理的信息是多种多样的,如各种进位制的数据,不同语种的文字符号和各种图像信息等。
但在计算机内部采用的是二进制计数制,这种进制表达方法对于人们研究分析是不那么方便的。
本次课程设计将通过所学的微机原理知识理论,用汇编语言编写程序,实现二进制、十进制与十六进制之间的相互转换,并在MF2KP软件上演示。
关键词:汇编程序进制转换MF2KP1 原理分析进位计数制是人们利用符号来计数的方法。
一种进位计数制包含一组数码符号和两个基本因素。
数码是用不同的数字符号来表示一种数制的数值,这些数字符号称为”数码”。
微机原理软件实验步骤说明
汇编语言程序设计的实验环境及实验步骤淮北师范大学苗曙光图示操作步骤:1、开始-运行2、在运行窗口输入cmd3、进入DOS操作界面3、改变盘符路径cd..4、改成了试验程序所在的路径(1)编辑源程序(生成.ASM文件) 输入:D:\shiyan>masm 1-1直接按回车(2)连接目标程序(.OBJ → .EXE )输入:D:\shiyan>link 1-1(3)运行可执行程序1-1.exe文字说明部分:知识提要:本章主要进行汇编语言实验环境及实验步骤,涉及到的知识点包括:1、汇编语言源程序编写好以后, 必须经过下列几个步骤才能在机器上运行: (1) 编辑源程序(生成.ASM文件) (2) 汇编源程序(.ASM → .OBJ) (3) 连接目标程序(.OBJ → .EXE ) (4) 调试可执行程序(使用调试程序Debug调试生成的.EXE文件)(5) 运行程序输出结果。
2、 Windows环境下的汇编语言集成编程环境的使用实验一 DOS环境下的汇编语言编程环境使用(基础与验证型)一、实验要求和目的1、掌握汇编语言程序设计的基本方法和技能;2、熟练掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序;3、熟练掌握宏汇编程序MASM的使用;4、熟练掌握连接程序LINK的使用。
二、软硬件环境1、硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2、软件环境:装有MASM 5.0、DEBUG、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等应用程序。
三、实验涉及的主要知识单元1、汇编语言源程序的汇编过程汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:扩展名为 .OBJ的目标文件、扩展名为 .LST 的列表文件和扩展名为 .CRF 的交叉索引文件。
微机原理7_汇编语言程序设计08
汇编语言程序设计
1
7.1 汇编语言程序设计的一般步骤
汇编语言程序设计一般有以下几个步骤:p146 1.分析问题,确定算法 2.绘制流程图 3.根据流程图编制程序 4.调试程序
2
7.1.1 流程图
1.流程图的概念 流程图是由特定的几何图形、指向线、文字说明 来表示数据处理的步骤,形象描述逻辑控制结构 以及数据流程的示意图。流程图具有简洁、明了、 直观的特点。
32
lea si,num1+2 ;置被减数低位指针 lea di,num2+2 ;置减数低位指针 mov ah,‘+‘ ;预置结果为+ xor bx,bx ;置指针初值 mov cx,3 ;置循环次数 lop1: mov al,num1[bx] ;比较被减数S1和减数S2 cmp al,num2[bx] ;从高到低依次比较 je next1 ;相等比较下一位 jnc next2 ; 若S1>S2,转移 mov ah,‘-‘ ; 若S1<S2,修改结果为— xchg si,di ;指针交换 jmp next2 next1: inc bx ;指针指向下一位 loop lop1
25
LOP1:MOV AL,[BX] CMP AL,0 JGE JUS INC DX JUS: INC BX DEC CX JNZ LOP1 MOV RS,DX MOV AH,4CH INT 21H CODE ENDS END
26
例7.6:确定一个字变量中为1的最低位数。
Y 条件成立? N
分支语句体1
分支语句体2 后续操作
JMP
微机原理8086汇编语言程序设计
;这是一个乘10子程序
;使用寄存器AX
;入口:AX,出口:AX
proc far
push bx
;保护现场
pushf
add ax,ax
;2ax
功
mov bx,ax
;2ax ?bx
能
add ax,ax
;4ax
程
add ax,ax
;8ax
序
add ax,bx
;10ax
段
popf
;恢复现场
pop bx
ret
endp
第四章 8086汇编语言程序设计
? 几个概念 ? 8086汇编语言的语句 ? 8086汇编中的伪指令 ? 8086汇编中的运算符 ? 汇编语言程序设计 ? 宏定义与宏调用 ? 系统调用
几个概念
? 汇编语言 ? 汇编语言源程序 ? 汇编 ? 汇编程序
4.1 8086汇编语言的语句
汇编语言由指令性语句和指令性语句组成 ? 一、指令性语句格式
CODE SEGMENT
;定义代码段
ASSUME DS:DATA , CS: CODE
START: MOV AX , DATA
;初始化DS
MOV DS , AX
……
MOV AX , 4C00H ;返回DOS
INT 21H
CODE ENDS
;代码段结束
END START
;源程序结束
;段属性说明
? 特点 ? 程序分段 ? 语句由指令性和指示性语句组成 ? 两种程序框架
? 3、 ORG伪指令、地址计数器 $
ORG伪指令格式: ORG <表达式>
? 4、END 表示源代码结束 格式为: END 常数或表达式.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;**********************; ;* 数/模转换实验1 *;;* 产生锯齿波 *;;**********************;io0832a equ 290hcode segmentassume cs:codestart: mov cl,0mov dx,io0832alll: mov al,clout dx,aladd cl,10push dxmov ah,06h ;判断是否有键按下mov dl,0ffhint 21hpop dxjz lll ;若无则转LLLmov ah,4ch ;返回int 21hcode endsend start;**********************;;* 数/模转换实验2 *;;* 产生正弦波 *;;**********************;data segmentio0832a equ 290hSin db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdhdb0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hdb 80h,66h,4eh,38h,25h,15h,09h,04h Db00h,04h,09h,15h,25h,38h,4eh,66h;正弦波数据data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axll: mov si,offset sin ;置正弦波数据的偏移地址为SI mov bh,32 ;一组输出32个数据lll: mov al,[si] ;将数据输出到D/A转换器mov dx,io0832aout dx,almov ah,06hmov dl,0ffhint 21hjne exitmov cx,1delay: loop delay ;延时inc si ;取下一个数据dec bhjnz lll ;若未取完32个数据则转llljmp llexit: mov ah,4ch ;退出int 21hcode endsend start;****************************;;* AD转换器2--示波器 *;;* 采集数据在屏幕是作图 *;;****************************;io0809b equ 299hcode segmentassume cs:codestart: mov ax,0012h ;设屏幕显示方式为VGA 640X480模示int 10hstart1:mov ax,0600hint 10h ;清屏and cx,0 ;cx为横坐标draw: mov dx,io0809b ;启动A/D转换器通道1out dx,almov bx,200;500 ;延时delay: dec bxjnz delayin al,dx ;读入数据mov ah,0mov dx,368 ;dx为纵坐标 sub dx,axmov al,0ah ;设置颜色mov ah,0ch ;画点int 10hcmp cx,639 ;一行是否满 jz start1 ;是则转startinc cx ;继续画点push dxmov ah,06h ;是否有键按下mov dl,0ffhint 21hpop dxje draw ;无,则继续画点mov ax,0003 ;有恢复屏幕为字符方式int 10hmov ah,4ch ;返回int 21hcode endsend start;************************;;*8251串行通讯(自发自收)*;;************************;data segmentio8253a equ 280hio8253b equ 283hio8251a equ 2b8hio8251b equ 2b9hmes1 db 'you can play a key on the keybord!',0dh,0ah,24hmes2 dd mes1data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8253b ;设置8253计数器0工作方式 mov al,16hout dx,almov dx,io8253amov al,52 ;给8253计数器0送初值out dx,almov dx,io8251b ;初始化8251xor al,almov cx,03 ;向8251控制端口送3个0delay: call out1loop delaymov al,40h ;向8251控制端口送40H,使其复位call out1mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16call out1mov al,27h ;向8251送控制字允许其发送和接收call out1lds dx,mes2 ;显示提示信息 mov ah,09int 21hwaiti: mov dx,io8251bin al,dxtest al,01 ;发送是否准备好 jz waitimov ah,01 ;是,从键盘上读一字符int 21hcmp al,27 ;若为ESC,结束 jz exitmov dx,io8251ainc alout dx,al ;发送mov cx,40hs51: loop s51 ;延时next: mov dx,io8251bin al,dxtest al,02 ;检查接收是否准备好jz next ;没有,等待mov dx,io8251ain al,dx ;准备好,接收mov dl,almov ah,02 ;将接收到的字符显示在屏幕上int 21hjmp waitiexit: mov ah,4ch ;退出int 21hout1 proc near ;向外发送一字节的子程序out dx,alpush cxmov cx,40hgg: loop gg ;延时pop cxretout1 endpcode endsend start;;8259中断查询方式应用实验;************************************ *****************************; 2008年03月为8259应用修改;************************************ *****************************I8259_1 EQU 2B0H ;8259的ICW1端口地址I8259_2 EQU 2B1H ;8259的ICW2端口地址I8259_3 EQU 2B1H ;8259的ICW3端口地址I8259_4 EQU 2B1H ;8259的ICW4端口地址O8259_1 EQU 2B1H ;8259的OCW1端口地址O8259_2 EQU 2B0H ;8259的OCW2端口地址O8259_3 EQU 2B0H ;8259的OCW3端口地址data segmentmes1 db 'you can play a key on the keyboard!',0dh,0ah,24hmes2 dd mes1mess1 db 'Hello! This is interrupt * 0 *!',0dh,0ah,'$'mess2 db 'Hello! This is interrupt * 1 *!',0dh,0ah,'$'mess3 db 'Hello! This is interrupt * 2 *!',0dh,0ah,'$'mess4 db 'Hello! This is interrupt * 3 *!',0dh,0ah,'$'mess5 db 'Hello! This is interrupt * 4 *!',0dh,0ah,'$'mess6 db 'Hello! This is interrupt * 5 *!',0dh,0ah,'$'mess7 db 'Hello! This is interrupt * 6 *!',0dh,0ah,'$'mess8 db 'Hello! This is interrupt * 7 *!',0dh,0ah,'$'data endsstacks segmentdb 100 dup()stacks endsSTACK1 SEGMENT STACKDW 256 DUP()STACK1 ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:stacks,ES:DATA.386START: mov ax,datamov ds,axmov es,axmov ax,stacksmov ss,axMOV DX,I8259_1 ;初始化8259的ICW1MOV AL,13H ;边沿触发、单片8259、需要ICW4OUT DX,ALMOV DX,I8259_2 ;初始化8259的ICW4MOV AL,0B0H ;非自动结束EOIOUT DX,AL;MOV AL,00H;OUT DX,ALMOV AL,03HOUT DX,ALMOV DX,O8259_1 ;初始化8259的OCW1MOV AL,00H ;打开IR0和IR1的屏蔽位OUT DX,ALQUERY: MOV AH,1 ;判断是否有按键按下INT 16HJNZ QUIT ;有按键则退出MOV DX,O8259_3 ;向8259的OCW3发送查询命令MOV AL,0CHOUT DX,ALIN AL,DX ;读出查询字MOV AH,ALAND AL,80HTEST AL,80H ;判断中断是否已响应JZ QUERY ;没有响应则继续查询MOV AL,AHAND AL,07HCMP AL,00H JE IR0ISR ;若为IR0请求,跳到IR0处理程序CMP AL,01HJE IR1ISR ;若为IR1请求,跳到IR1处理程序CMP AL,02HJE IR2ISRCMP AL,03HJE IR3ISRCMP AL,04HJE IR4ISRCMP AL,05HJE IR5ISRCMP AL,06HJE IR6ISRCMP AL,07HJE IR7ISRJMP QUERYIR0ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess1 ;显示提示信息MOV AH,09INT 21HJMP EOIIR1ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess2 ;显示提示信息MOV AH,09INT 21HJMP EOIIR2ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess3 ;显示提示信息MOV AH,09INT 21HJMP EOIIR3ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess4 ;显示提示信息MOV AH,09INT 21HJMP EOIIR4ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess5 ;显示提示信息MOV AH,09INT 21HJMP EOIIR5ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess6 ;显示提示信息MOV AH,09INT 21HJMP EOIIR6ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess7 ;显示提示信息MOV AH,09INT 21HJMP EOIIR7ISR: MOV AX,DATAMOV DS,AXMOV DX,offset mess8 ;显示提示信息MOV AH,09INT 21HEOI:MOV DX,O8259_2 ;向8259发送中断结束命令MOV AL,20HOUT DX,ALJMP QUERYQUIT: MOV AX,4C00H ;结束程序退出INT 21H CODE ENDSEND START;*******************************;;* DMA传送实验(块传送) *;;* 2008年2月为8237扩展板修改 *; ;*******************************;io8237 equ 280h ;从8237地址code segmentassume cs:codestart:mov ax,0D000hmov es,axmov bx,4000hmov cx,0ffH;传输个数mov dl,40h;字符Arep1: inc dlmov es:[bx],dlinc bxcmp dl,5ahjnz ss1mov dl,40hss1: loop rep1mov dx,18h ;关闭主8237mov al,04hout dx,almov dx,1dh ;复位主8237mov al,00hout dx,almov dx,18h ;开启主8237,DACK信号高有效mov al,80hout dx,almov dx,1bh ;主8237为级联方式mov al,0c0hout dx,almov dx,io8237+08h ;关闭从8237out dx,almov dx,io8237+0dh ;复位从8237mov al,00hout dx,almov dx,io8237+02h ;写目的地址低位mov al,00hout dx,almov dx,io8237+02h ;写目的地址高位mov al,42hout dx,almov dx,io8237+03h ;传送字节数低位mov al,0ffhout dx,almov dx,io8237+03h ;传送字节数高位mov al,00hout dx,almov dx,io8237+00h ;源地址低位mov al,00hout dx,almov dx,io8237+00h ;源地址高位mov al,40hout dx,almov dx,io8237+0bh ;通道1写传输,地址增mov al,85hout dx,almov dx,io8237+0bh ;通道0读传输,地址增mov al,88h movdx,io8237+08h ;DREQ低电平有效,存储器到存储器,开启从8237mov al,41hout dx,almov dx,io8237+09h ;通道1请求mov al,04hout dx,almov cx,0F000hdelay: loop delaymov ax,0D000hmov es,axmov bx,04200h;目的地址起始mov cx,0ffh;读出字符个数rep2: mov dl,es:[bx]mov ah,02hint 21hinc bxloop rep2mov ax,4c00hint 21hcode endsend start;*******************;* 8253分频 *;*******************io8253a equ 280hio8253b equ 281hio8253c equ 283hcode segmentassume cs:codestart:mov dx,io8253c ;向8253写控制字mov al,36h ;使0通道为工作方式3out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253aout dx,al ;先写入低字节out dx,al ;后写入高字节mov dx,io8253cmov al,76h ;设8253通道1工作方式2out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253bout dx,al ;先写低字节mov al,ahout dx,al ;后写高字节mov ah,4ch ;程序退出int 21hcode endsend start;*************************;;* 8253方式0计数器实验 *;;*************************;io8253a equ 283hio8253b equ 280hcode segmentassume cs:codestart: mov al,14h ;设置8253通道0为工作方式2,二进制计数mov dx,io8253aout dx,almov dx,io8253b ;送计数初值为0FHmov al,0fhout dx,allll: in al,dx ;读计数初值 call disp ;调显示子程序push dxmov ah,06hmov dl,0ffhint 21hpop dxjz lllmov ah,4ch ;退出int 21hdisp proc near ;显示子程序push dxand al,0fh ;首先取低四位 cmp dl,9 ;判断是否<=9jle num ;若是则为'0'-'9',ASCII码加30Hadd dl,7 ;否则为'A'-'F',ASCII码加37Hnum: add dl,30hmov ah,02h ;显示int 21hmov dl,0dh ;加回车符int 21hmov dl,0ah ;加换行符int 21hpop dxret ;子程序返回disp endpcode endsend start对不起,我题找不到了,但是我可以告诉你重点在哪 2012的题编程很多,但是选择填空都是很基本的问题。