微机原理实验考试代码

合集下载

《微机原理实验》考试题及答案

《微机原理实验》考试题及答案

1 题目:编程将(AX )=2387、(BX )=192FH 、(CX )=9256中的无符号数按由大到小排序,上机编程调试出程序,并将程序及排序结果记录在下面。

CODE SEGMENT ASSUME CS:CODE START: MOV AX,2387 MOV BX,192FH MOV CX,9256 CMP AX,BX JAE NEXT1 XCHG AX,BX NEXT1: CMP AX,CX JAE NEXT2 XCHG AX,CX NEXT2: CMP BX,CX JAE NEXT3 XCHG BX,CX NEXT3:MOV AH,4CH INT 21H CODE ENDS END START4 题目:中断向量为:1234:5678H ,编程将此中断向量写入类型0所在的中断向量表,上机调试出程序,并将程序和结果记录下来。

(直接用MOV 指令写入即可)code segmentassume cs:code,ds:code start:xor ax,ax mov ds,ax mov bx,0 mov cl,2 shl bx,clmov word ptr[bx],5678h mov word ptr[bx+2],1234h mov ah,4ch int 21h code ends end start2题目:在数据段中定义如下数据:32,34,89H,,编程将以上数据按有符号数进行排序,并将程序和结果记录下来。

DA TA SEGMENT NUM DB 32,34,89H DA TA ENDS CODE SEGMEN TASSUME CS:CODE,DS:DA TA STAR T: MOV AX,DA TAMOV DS,AX ;初始化D SLEA BX ,NUM ;取有效地址到BX ,以便访问要排序的数MOV AL,[BX] CMP AL,[BX +1]JGE NEXT1 ;若第一个数大则跳转,否则将第一个与第二个数交换XCHG AL,[BX+1] MOV [BX],AL NEXT1: CMP AL,[BX +2]JGE NEXT2;若第一个数大则跳转,否则将第一个与第三个数交换XCHG AL,[BX+2] MOV [BX],AL NEXT2:MOV AL,[BX+1];将第二个和第三个数比较 CMP AL,[BX +2]JGE NEXT3;若第二个数大则跳转,否则将第二个与第三个数交换XCHG AL,[BX+2] MOV [BX+1],AL NEXT3: MOV AH,4CH INT 21H CODE ENDS3 题目:在数据段中定义如下数据:99,25,86,编程将以上数据按无符号数进行排序,上机调试出程序,并将程序和结果记录下来。

微机原理考试必备

微机原理考试必备

数据段中有一字符串(10B),要求传送到附加段(符号地址MESS2开始)中的一个缓冲区解: DATA SEGMENT;MESS1 DB '0123456789';DATA ENDS;EXTA SEGMENT;MESS2 DB 10 DUP(0);EXTA ENDS;CODE SEGMENT;ASSUMECS:CODE,DS:DATA,ES:EXTA;BEGIN: MOV AX,DATA;MOVDS,AX;MOV AX,EXTA;MOV ES,AX;CLD;MOV CX,5;MOV SI,0;MOV DI,0;REP MOVSW;CODE ENDS;END BEGIN;以BUF为首地址的内存单元中,存放若干个8位的带符号数,统计数组中大于等于0的个数,并将结果存入result字节单元中解 BUFF DB 1,-4,90,16,0,36,-49,-68;CNT EQU $ - BUFF;RESULTDB ?;DATA ENDS;STACK SEGMENT PARA 'stack';DB 100DUP(0);STACK ENDS;CODE SEGMENT;ASSUMECS:CODE,DS:DATA,SS:STACK;START: MOV AX,DATA;MOVDS,AX;LEA SI,BUFF;MOV DL,0;MOV CL,CNT;LOP1: MOV AL,[SI];CMP AL,0;JL LOP2;INC DL;LOP2: INC SI;DEC CL;JNZ LOP1;MOV RESULT,DL;MOV AH,4CH;INT 21H;CODE ENDS;END START;编一个程序,累加数组中的元素,并将和存入SUM单元DATA SEGMENT;ARY DW 1,2,3,4,5,6,7,8,9,10;COUNT DW10;SUM DW ?;DATA ENDS;CODE SEGMENT;MAIN PROC FAR;ASSUME CS:CODE,DS:DATA;START: PUSH;SUB AX,AX;PUSH AX;MOV AX,DATA;MOV DS,AX;CALL PROADD;RET;MAIN ENDP;PROADD PROC NEAR;PUSH AX;PUSH CX;PUSH SI;LEA SI,ARY;MOV CX, [COUNT];XOR AX,AX;NEXT: ADD AX,[SI];ADD SI,2;LOOP NEXT;MOV [SUM],AX;POP SI;POP CX;POP AX;RET;PROADD ENDP;CODE ENDS;END START;1加到100存到一个变量中ASSUME CS:CODE , DS:DATA;DATA SEGMENT;JIEGUO DW ?;DATA ENDS;CODE SEGMENT;START:;MOV AX , DATA;MOV DS ,AX;MOV CX , 100;MOV AX , 0;LOOPR:;ADD AX , CX;LOOP LOOPR;MOV BX , 0000H;MOV WORD PTR[BX] , AX;CODE ENDS;END START;2.请用汇编语言编写一程序,完成将自然数中的偶数相加。

微机原理代码

微机原理代码
xor cx,cx ;作为计数寄存器
again: mov si,offset leddt
call process
inc cx
call jishu
jmp Start
mov ax,4c00h
int 21h
Process proc
Push ax
Push dx
mov dx,0f003h ;8255初始化编程
mov al,10000010b
out dx,al
mov dx,0f000h ;初始状态指示灯灭
push ax
push cx
mov si,offset ledbh
mov di,offset leddt
mov cx,8
again2:mov al,[si]
mov [di],al
or al,10111111b
cmp al,11111111b
Jz pg3
Mov dx,0f000h ;启动车床主轴
Mov al,11111011b
Out dx,al
Pg4: Mov dx,0f001h ;车削结束
End start
Mov dx,0f000h ;液压定位装置启动
Mov al,11111110b
Out dx,al
Pg2: Mov dx,0f001h ;光电传感器中心定位是否准确
In al,dx
or al,11011111b
.model small
extrn display8:near
.Stack
.Data
Leddt db 8 dup(00h) ; 要显示数字缓冲区

微机原理考试编程

微机原理考试编程

第6章 16位微机原理及其程序设计实验本章主要介绍汇编语言程序设计,通过实验来学习80X86的指令系统、寻址方式以及程序的设计方法,同时掌握联机软件的使用。

6.1 系统认识实验6.1.1 实验目的掌握TD系列微机原理及接口技术教学实验系统的操作,熟悉Wmd86联机集成开发调试软件的操作环境。

6.1.2 实验设备PC机一台,TD-PITE实验装置一套。

6.1.3 实验内容编写实验程序,将00H~0FH共16个数写入内存3000H开始的连续16个存储单元中。

图6.4 程序编辑界面5. 点击,编译文件,若程序编译无误,则可以继续点击进行链接,链接无误后方可以加载程序。

编译、链接后输出如图6.5所示的输出信息。

图6.5 编译输出信息界面6. 连接PC与实验系统的通讯电缆,打开实验系统电源。

7. 编译、链接都正确并且上下位机通讯成功后,就可以下载程序,联机调试了。

可以通过端口列表中的“端口测试”来检查通讯是否正常。

点击下载程序。

为编译、链接、下载组合按钮,通过该按钮可以将编译、链接、下载一次完成。

下载成功后,在输出区的结果窗中会显示“加载成功!”,表示程序已正确下载。

起始运行语句下会有一条绿色的背景。

如图2.6所示。

图2.6 加载成功显示界面8. 将输出区切换到调试窗口,使用D0000:3000命令查看内存3000H起始地址的数据,如图6.7所示。

存储器在初始状态时,默认数据为CC。

图6.7 内存地址单元数据显示9. 点击按钮运行程序,待程序运行停止后,通过D0000:3000命令来观察程序运行结果。

如图6.8所示。

图6.8 运行程序后数据变化显示10. 也可以通过设置断点,断点显示如图6.9所示,然后运行程序,当遇到断点时程序会停下来,然后观察数据。

可以使用E0000:3000来改变该地址单元的数据,如图6.10所示,输入11后,按“空格”键,可以接着输入第二个数,如22,结束输入按“回车”键。

图6.9 断点设置显示图6.10 修改内存单元数据显示界面实验例程文件名为Wmd861.asm。

西南交大微机原理实验代码与截图(ALL)

西南交大微机原理实验代码与截图(ALL)

2-1DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV SI,3500H ;设置待转换数据区的地址指针MOV DI,3510H ;设置结果数据区的地址指针MOV BX,000AH ;乘数10MOV CX,0004H ;循环4 次MOV AH,00HMOV AL,[SI] ;取第一位ASCⅡ码SUB AL,30H ;转换成二进制数A1:IMUL BX ;乘10ADD AL,[SI+01] ;加次位SUB AL,30HINC SI ;修改地址指针LOOP A1 ;循环MOV [DI],AX ;保存结果INT 3H;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START2-2DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV CX,0005H ;循环计数器赋初值MOV DI,3500H ;ASCⅡ码首址A1:MOV BL,0FFH ;将错误标志送入BLMOV AL,[DI] ;送ASCⅡ码至ALCMP AL,3AH ;比较AL 与3AJNB A2 ;不低于3A 则转A2SUB AL,30H ;低于3A 则取ASCⅡ码低4 位 JB A2 ;低于30 则转A2MOV BL,AL ;否则AL 内容送入BL,取代FF A2:MOV AL,BL ;结果或错误标志送入ALMOV [DI+0AH],ALINC DILOOP A1INT 3HCODES ENDSEND START2-5DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,0B07HMOV DS,AXMOV DI,3000HMOV DX,9111HMOV CX,2222HTEST DH,80HJZ LPXOR DX,7FFFHNOT CXADC CX,1ADC DX,0LP:MOV [DI],CLMOV [DI+1],CHMOV [DI+2],DLMOV [DI+3],DHINT 3INT 3HCODES ENDSEND START3DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV CX,10HMOV SI,3000HMOV DI,3010HCMP SI,DIJA A2ADD SI,CXADD DI,CXDEC SIDEC DIA1:MOV AL,[SI]MOV [DI],ALDEC SIDEC DIDEC CXJNE A1JE A3A2:MOV AL,[SI]MOV [DI],ALINC SIINC DIDEC CXJNE A2A3:INT 3HCODES ENDSEND START4-1DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV DX,01HMOV BL,02HA1:MOV AL,BLINC BLMUL BLADD DX,AXCMP AX,0C8HJBE A1INT 3HCODES ENDSEND START4-2DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV DI,3000HMOV CX,[DI]MOV CH,00HMOV BL,00HINC DIA1:MOV AX,[DI]CMP AX,0000HJGE A2INC BLA2:INC DILOOP A1MOV [DI],BLINT 3HCODES ENDSEND START5-1DATAS SEGMENTAA DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9H;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAS,SS:STACKS SUB1 PROC NEARCMP CX,0JE A4DEC CXMOV BH,[SI]MOV BL,BHA1:INC SIMOV AL,[SI]CMP AL,BHJAE A2CMP AL,BLJBE A3JMP A4A2:MOV BH,ALJMP A4A3:MOV BL,ALA4:LOOP A1RETSUB1 ENDPSTART:MOV AX,DATASMOV DS,AXMOV SI,OFFSET AAMOV CX,0008HCALL NEAR PTR SUB1MOV AH,BHMOV AL,BLINT 3CODE ENDSEND START实验6DATAS SEGMENTORG 3000HVAR DB 11H,0d3H,77H,6bH,0BH,33H,0aaH,21H,0ffH,67H ;此处输入数据段代码DATAS ENDSSTACKS SEGMENTDW 100 DUP(?);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV CX,000AHMOV SI,300AHMOV BL,0FFHA1: CMP BL,0FFHJNE A4MOV BL,00HDEC CXCMP CX,0JE A4PUSH SIPUSH CXA2: DEC SIMOV AL,[SI]MOV DL,[SI-1]CMP AL,DLJA A3MOV [SI-1],ALMOV [SI],DLMOV BL,0FFHA3: LOOP A2POP CXPOP SIJMP A1A4: INT 3;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START实验七DATAS SEGMENT;此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTSTART:MOV AL,0MOV BH,0AH ;表示前景、背景颜色MOV AH,6HMOV CX,0MOV DH,24MOV DL,79INT 10H ;清屏幕MOV AH,2MOV BH,0MOV DH,10HMOV DL,10HINT 10H ;光标设置在第10行第10列MOV CX,001AH ;共26个字母,所以循环次数为26MOV DL,'Z'LP:MOV AL,DLMOV BH,0MOV BL,2FH ;设置显示的A到Z的底色和字色MOV AH,9INT 10HDEC DLLOOP LPINT 3CODES ENDSEND START实验八.486pd8255 macro port,data1mov dx,portmov eax,data1out dx,eaxnopnopendmdata segment at 0 use16org1*4v1 dw 2 dup(?)org2*4v2 dw 2 dup(?)org3*4v3 dw 2 dup(?)org1000httt db?stackp equ2000hP255CW equ20CHP255A equ200HP255B equ204HP255C equ208Hdata endscode segment use16assume cs:code,ds:data,ss:dataorg1100hstart: nopmov ax,0mov ds,axmov ss,axmov sp,stackpiniti: mov eax,60000000hmov cr0,eaxmov ax,datamov ds,axmov ss,axmov sp,stackpmov cx,1000i0: dec cxjnz i0d8255 P255CW,80808080hi1: d8255 P255A,0c099c099hd8255 P255B,0c0c0c0c0h ;40004000 d8255 P255C,0fafafafah ;绿call del1d8255 P255C,0f5f5f5f5h ;红call del1d8255 P255C,0f0f0f0f0h ;黄call del1d8255 P255C,0ffffffffh ;灭call del1d8255 P255A,8ef8c0c0hd8255 P255B,8E8ec0c0h ;00007FFFd8255 P255C,0fafafafahcall del1d8255 P255C,0f5f5f5f5hcall del1d8255 P255C,0f0f0f0f0hcall del1d8255 P255C,0ffffffffhcall del1mov ax,4000hmov es,axmov eax,0chk: mov bx,0000h ;从4000:0000单元开始写mov es:[bx],eaxmov dx,P255Aout dx,eaxnopnopmov dx,P255Bout dx,eaxnopnoppush eax ;写入的数据入栈mov eax,0fafafafahmov dx,P255C ;绿色out dx,eaxcall del1pop eax ;出栈chk1: add bx,4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;cmp bx,8000hjz chk2 ;写满8000H个内存单元mov es:[bx],eaxjmp chk1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;chk2: mov bx,0fffchchk3: add bx,4cmp bx,8000hjz chk0cmp eax,es:[bx] ;把每个单元的数据读出与写入的jz chk3mov ecx,eax ;数据比较,是否正确mov eax,0f5f5f5f5hmov dx,P255C ;不正确,颜色变成红色out dx,eaxmov eax,ecxcall del1 ;延时chk0: add eax,01010101h ;;;;;;;;;;;;;;;;;;;;;;;;;;;cmp eax,0ffffffffh ;下一个写入的数据jz chk4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;jmp chkchk4: jmp i1del1 proc ;延时mov ecx,8ffffhi2: dec ecxjnz i2retendpcode endsend start实验10.1:(以key为原本改进).486DA TA SEGMENT AT 0 USE16ORG 1000HDA TA ENDSCODE SEGMENT USE16ASSUME CS:CODEORG 3000HBEG: JMP STARTTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FHDPORT1 EQU 360HDPORT2 EQU 380HNUM DB 0001HCOUNT DD 00000FFFFH START: MOV AX,DA TAMOV DS,AXMOV CL,5KK: MOV AL,CLMOV BX,OFFSET TAB XLAT TABMOV DX,DPORT2OUT DX,ALNOPMOV DX,DPORT1MOV AL,NUMOUT DX,ALNOPNOPROL NUM,1MOV COUNT,00000FFFFH DELAY:NOPDEC COUNTJNZ DELAYJMP KKCODE ENDSEND BEG实验10.2使显示20115158.486DA TA SEGMENT AT 0 USE16ORG 2000HBUF D D ?COUNT DB ?DB ?DA TA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATAORG 01000HBEG: JMP STARTTAB1 DB 0A4H,0F9H,92H,92HTAB2 DB 0C0H,0F9H,0F9H,80HRG DD 050A050AHGR DD 0A050A05HRY DD 05000500HYR DD 00050005HRRRR DD 05050505HRGYR DD 050A0005H START: MOV AX,DA TAMOV DS,AXMOV DX,20CHMOV EAX,80808080HOUT DX,EAXNOPNOPL1:MOV DX,200HMOV EAX,DWORD PTR TAB1OUT DX,EAXMOV BP,200L2: DEC BPJNZ L2MOV DX,204HMOV EAX,DWORD PTR TAB2OUT DX,EAXMOV BP,200L3: DEC BPJNZ L3MOV DX,208HMOV EAX,RGYROUT DX,EAXMOV BP,200L4: DEC BPJNZ L4HLTJMP L1CODE ENDSEND BEG三连实验9;i8259.asm.486DA TA SEGMENT USE16 AT 0ORG 40H*4V40H DW ?,? ;保存中断向量的变量OPORT EQU 3A0H ;8259的偶地址JPORT EQU 3A8H ;8259的奇地址TR8255 EQU 20CH ;8255控制口地址A8255 EQU 200H ;8255A口地址B8255 EQU 204H ;8255B口地址C8255 EQU 208H ;8255C口地址ORG 1000HMM DD ?DA TA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DA TAORG 2000HBEG: CLIJMP STARTSTART: MOV AX,DA TAMOV DS,AXMOV AX,0MOV SS,AXMOV SP,1000HMOV MM,0F5F5F5F5HMOV AL,80H ;初始化8255MOV DX,TR8255OUT DX,ALMOV AL,99HMOV DX,A8255OUT DX,ALMOV AL,5MOV DX,C8255OUT DX,ALCALL WRITEVERLLL: MOV AL,00010011B ;写ICW1MOV DX,OPORTOUT DX,ALNOPNOPMOV AL,01000000B ;写ICW2MOV DX,JPORTOUT DX,ALNOPNOPMOV AL,00000001B ;写ICW4MOV DX,JPORTOUT DX,ALNOPNOPMOV AL,11111100B ;写IMRMOV DX,JPORTOUT DX,ALSTI;---------------------------------------LL: MOV SI,1 ;等待中断LL1: MOV CX,10000LL2: NOPLOOP LL2DEC SIJNZ LL1NOPNOPNOPNOPNOPNOPNOPNOPNOPJMP LL;--------------------------------------WRITEVER PROC ;写中断向量PUSHAMOV BX, OFFSET SERVERMOV V40H,BXMOV AX,CSMOV V40H+2,AXPOPARETWRITEVER ENDP;-------------------------------------SERVER PROC ;中断服务程序,显示-SUCCESS MOV EAX,92C6C1BFHMOV DX,A8255OUT DX,EAXMOV EAX,9286C692HMOV DX,B8255OUT DX,EAXMOV EAX,MMMOV DX,C8255OUT DX,EAXNOT EAXMOV MM,EAXMOV AL,20HMOV DX,OPORTOUT DX,ALIRETSERVER ENDP;-------------------------------------CODE ENDSEND BEG实验11.486CODE SEGMENT USE16A SSUME CS:CODEO RG 1000HBEG: J MP STARTCCONPORT E QU 30CHCCONBIT1 EQU 00010110BCCONBIT2 EQU 01010100BCCONBIT3 EQU 10010110BCDPORT1 EQU 300HCDPORT2 EQU 304HCDPORT3 EQU 308HCHDBIT1 EQU 08HCHDBIT2 EQU 04HSTART: N OP ;启动延时NOPMOV DX,CCONPORT ;写入控制字MOV AL,CCONBIT1O UT DX,ALNOPNOPMOV DX,CDPORT1 ;写入初值MOV AL,CHDBIT1OUT DX,ALNOPNOPMOV DX,CCONPORT ;写入控制字MOV AL,CCONBIT2OUT DX,ALNOPNOPMOV DX,CDPORT2 ;写入初值MOV AL,CHDBIT1OUT DX,ALNOPNOPWT1: M OV DX,CCONPORT ;写入控制字M OV AL,CCONBIT3O UT DX,ALNOPNOPMOV DX,CDPORT3 ;写入初值MOV AL,CHDBIT2OUT DX,ALWT: NOPJMP WTCODE ENDSEND BEG实验13.486DA TA SEGMENT AT 0 USE16 ORG 1000HMM DB ?DA TA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATAORG 2000HBEG: JMP STARTTAB DB 0C0H,0F9HLENS EQU $-TABC8251 EQU 330HD8251 EQU 320H CCONPORT EQU 30CHCCONBIT1 EQU 00010110B CCONBIT2 EQU 01010110B CCONBIT3 EQU 10010110B CDPORT1 EQU 300H CDPORT2 EQU 304H CDPORT3 EQU 308H CHDBIT1 EQU 9CHCHDBIT2 EQU 9CHC8255 EQU 20CHA8255 EQU 200HB8255 EQU 204HSTART: MOV AX,DA TAMOV DS,AXCALL I8254CALL I8251MOV DX,C8251IN AL,DXCALL I8255AGAIN: MOV MM,05HMOV CL,LENSMOV BX,OFFSET TABTSCAN: MOV DX,A8255MOV EAX,0FFFFFFFFHOUT DX,EAXMOV DX,B8255OUT DX,EAXMOV DX,C8251IN AL,DXTEST AL,01HJZ TSCANSEND: MOV AL,[BX]MOV DX,D8251OUT DX,ALMOV SI,0RSCAN: MOV DX,C8251IN AL,DXTEST AL,02HJNZ RECIEVEDEC SIJNZ RSCANJMP NEXTRECIEVE: MOV DX,D8251 IN AL,DXMOV DX,A8255OUT DX,ALMOV DX,B8255OUT DX,ALMOV AL,MMNOT ALMOV DX,208HOUT DX,ALMOV MM,ALMOV BP,1000HDELAY: NOPDEC BPJNZ DELAYINC BXDEC CLJNZ TSCANJMP AGAINNEXT: MOV EAX,88F9A4BFH MOV DX,A8255OUT DX,EAXMOV EAX,0A1839280HMOV DX,B8255OUT DX,EAXJMP AGAINI8254 PROCNOPNOPNOPNOPNOPNOPNOPNOPMOV DX,CCONPORTMOV AL,CCONBIT1OUT DX,ALNOPNOPMOV DX,CDPORT1MOV AL,CHDBIT1OUT DX,ALNOPNOPMOV DX,CCONPORTMOV AL,CCONBIT3OUT DX,ALNOPNOPMOV DX,CDPORT3MOV AL,CHDBIT2OUT DX,ALNOPNOPWT1: MOV DX,CCONPORT MOV AL,CCONBIT2OUT DX,ALNOPNOPMOV DX,CDPORT2MOV AL,CHDBIT2OUT DX,ALRETI8254 ENDPI8251 PROCMOV CX,3AGA: MOV AL,0MOV DX,C8251OUT DX,ALLOOP AGAMOV BP,5HD1: DEC BPJNZ D1MOV AL,40HOUT DX,ALMOV BP,5HD2: DEC BP JNZ D2MOV AL,4EHOUT DX,ALMOV BP,5HD3: DEC BP JNZ D3MOV AL,15HOUT DX,ALRETI8251 ENDPI8255 PROCMOV DX,C8255MOV EAX,80808080HOUT DX,EAXRETI8255 ENDPCODE ENDSEND BEG。

微机原理

微机原理

微机原理考试题型:1、填空2、简答3、程序分析4、读图分析5、程序设计复习题:第一章5.已知下列二进制数码,写出它们的原码、反码和补码。

(1) 00000000(2) 01111100(3) 10000010(4) 11111111答:(1) 0000 0000的原码、反码和补码都为0000 0000(2) 0111 1100的原码、反码和补码都为0111 1100(3) 1000 0010的原码、反码和补码分别为1000 0010、1111 1101、1111 1110(4) 1111 1111的原码、反码和补码分别为1111 1111、1000 0000、1000 0001第二章简述8086/8088CPU的内部结构:答:8086/8088CPU的内部结构基本相同,它们均由两个独立的工作部件组成,一个称为执行部件EU,一个称为总线接口部件BIU。

(1)执行部件EU由算术逻辑单元ALU、暂存寄存器、标志寄存器、通用寄存器组和EU 控制器构成。

其任务只是执行指令,与外界的联系必须通过总线接口部件。

(2)总线接口部件BIU包括4个段寄存器、指令指针IP寄存器、指令队列缓冲器、完成与EU通信的内部寄存器、20位的地址加法器以及总线控制电路等。

它的任务是根据EU 的请求,完成CPU与存储器、CPU与I/O设备之间的信息传送。

4.对于8086CPU,已知(DS)=0150H,(CS)=0640H,(SS)=1200H,问:(1)在数据段中可存放的数据最多为多少字节?首末地址各是什么?(2)堆栈段中可存放多少个16位的字?首末地址各是什么?(3)代码段最大可存放多少个字节的程序?首末地址各是什么?答:(1)在数据段中可存放的数据最多为64KB,首地址为01500H,末地址为114FFH。

(2)在堆栈段中可存放32K个16位的字,首地址为12000H,末地址为21FFFH。

(3)代码段中最大可存放64KB的程序,首地址为06400H,末地址为163FFH。

微机原理实验代码打印

微机原理实验代码打印

1)从键盘输入一个2位无符号的16进制数(00H~FFH),然后在显示器上同时以二进制和十进制形式显示出来。

例如: Please input N(00H-FFH): 9BN = 9BH = 10011011B = 155stck segment stack 'stack'dw 32 dup(0)stck endsdata segmentENDL DB 0DH,0AH,'$' ;回车换行IBUF_HEX DB 3,0,3 DUP(0)OBUF_BIN DB 10 DUP('$')OBUF_BCD DB 4 DUP('$')STR_IN_HEX DB 'Please input N (00H~FFH):$'STR_OUT1 DB 'N = $'STR_OUT2 DB ' = $'data endscode segmentmain proc farassume ss:stck, cs:code, ds:datapush dsxor ax,axpush ax ;保存psp地址mov ax,datamov ds,axMOV DX,OFFSET STR_IN_HEX ;提示用户输入十六进制数,如9BMOV AH,9INT 21HMOV DX,OFFSET IBUF_HEX ;接收输入的十六进制数MOV AH,10INT 21HMOV DX,OFFSET ENDLMOV AH,9INT 21H ;回车换行MOV DX,OFFSET STR_OUT1 ;输出'N = 'MOV AH,9INT 21HMOV SI,OFFSET IBUF_HEX+2MOV CL,IBUF_HEX+1MOV CH,0PUSH SIADD SI,CXMOV BYTE PTR [SI],'$'POP SIMOV DX,SI ;输出输入的十六进制数,如9BHMOV AH,9INT 21HMOV DL,'H'MOV AH,2INT 21HMOV DX,OFFSET STR_OUT2 ;输出' = 'MOV AH,9INT 21HCALL hex2bin; 调用子函数,将输入的十六进制数转为二进制值PUSH AX ;AL压栈,留给指令CALL bcdout使用CALL binout ;把AL二进制值按二进制格式输出MOV DX,OFFSET STR_OUT2 ;输出' = 'MOV AH,9INT 21HPOP AXCALL bcdout ;把AL二进制值按十进制格式输出MOV DX,OFFSET ENDLMOV AH,9INT 21H ;回车换行retmain endp;十六进制数--->二进制数如: 输入:FF 处理:AL=FFHhex2bin procMOV CL,IBUF_HEX+1 ;保存输入字符个数MOV CH,0MOV SI,OFFSET IBUF_HEX+2MOV AX,0hex2bin_AGAIN:MOV DL,16 ;乘数为16MUL DL 乘积保存在AX中MOV BL,[SI]CMP BL,'A'JB hex2bin_SMALLERSUB BL,07Hhex2bin_SMALLER:SUB BL,30HADD AL,BLINC SILOOP hex2bin_AGAINrethex2bin endp;二进制数--->二进制格式输出如: AL=FFH 输出:11111111Bbinout procMOV BYTE PTR OBUF_BIN+8,'B'MOV DI,OFFSET OBUF_BINMOV AH,0MOV CX,8 ;设置LOOP循环次数binout_NEXT:MOV DL,0SHL AL,1ADC DL,30H ;将每一位转为ASCII码MOV [DI],DL ;保存转换后的ASCII码INC DILOOP binout_NEXT ;cx值为8,循环8次MOV DX,OFFSET OBUF_BIN ;输出处理结果MOV AH,9INT 21Hret ;返回调用binout endp;二进制数--->十进制数输出如: AL=0AH 输出:10bcdout procMOV DI,OFFSET OBUF_BCD+2MOV AH,0MOV CX,10bcdout_AGAIN:MOV DX,0 ;无符号数16位扩展为32位DIV CX ;余数DX,商AXADD DL,30HMOV [DI],DLDEC DIOR AX,AXJNE bcdout_AGAININC DIMOV DX,DI ;输出处理结果MOV AH,9INT 21Hretbcdout endpcode endsend main ;程序主函数入口2)将输入的十进制数0-255,实际数值保存在bl中,输出如下格式如:Please input N(0-255):180N = 180 = B4H = 10110100Bstck segment stack 'stack'dw 32 dup(0)stck endsdata segmentENDL DB 0DH,0AH,'$' ;回车换行STR_IN_BCD DB 'Please input N(0-255):$'STR_OUT1 DB 'N = $'STR_OUT2 DB ' = $'IBUF_BCD DB 4,0,4 DUP(0)OBUF_BIN DB 10 DUP('$')OBUF_HEX DB 4 DUP('$')data endscode segmentmain proc farassume ss:stck, cs:code, ds:datapush dsxor ax,axpush ax ;保存psp地址mov ax,datamov ds,axMOV DX,OFFSET STR_IN_BCDMOV AH,9INT 21H ;提示用户输入十进制数,如180MOV DX,OFFSET IBUF_BCDMOV AH,10INT 21H ;接收输入的十进制数MOV DX,OFFSET ENDLMOV AH,9INT 21H ;回车换行MOV DX,OFFSET STR_OUT1 ;输出'N = 'MOV AH,9INT 21HMOV CL,IBUF_BCD+1 ;保存字符个数MOV CH,0MOV SI,OFFSET IBUF_BCD+2 ;保存输入串首地址PUSH SIADD SI,CXMOV BYTE PTR [SI],'$'POP SIMOV DX,SI ;输出输入的十进制数MOV AH,9INT 21HMOV DX,OFFSET STR_OUT2 ;输出' = 'MOV AH,9INT 21HCALL bcd2binPUSH AXCALL hexoutMOV DX,OFFSET STR_OUT2 ;输出' = 'MOV AH,9INT 21HPOP AXCALL binoutMOV DX,OFFSET ENDL ;回车换行MOV AH,9INT 21Hret ;返回调用main endp十进制数--->二进制数如: 输入:10 处理:AL=0AHbcd2bin procMOV CL,IBUF_BCD+1 ;保存输入字符个数MOV CH,0MOV SI,OFFSET IBUF_BCD+2MOV AX,0bcd2bin_AGAIN:MOV DL,10 ;乘数为10MUL DL ;乘积保存在AX中MOV BL,[SI]SUB BL,30HADD AL,BLINC SILOOP bcd2bin_AGAINretbcd2bin endp二进制数--->二进制格式输出如: AL=FFH 输出:11111111Bbinout procMOV BYTE PTR OBUF_BIN+8,'B'MOV DI,OFFSET OBUF_BINMOV AH,0MOV CX,8 ;设置LOOP循环次数binout_NEXT:MOV DL,0SHL AL,1ADC DL,30H ;将每一位转为ASCII码MOV [DI],DL ;保存转换后的ASCII码INC DILOOP binout_NEXT ;cx值为8,循环8次MOV DX,OFFSET OBUF_BIN ;输出处理结果MOV AH,9INT 21Hret ;返回调用binout endp二进制数--->十六进制输出如: AL=FFH 输出:FFHhexout procMOV BYTE PTR OBUF_HEX+2,'H'MOV DI,OFFSET OBUF_HEX+1MOV AH,0MOV CX,16hexout_AGAIN:MOV DX,0 ;无符号数16位扩展为32位DIV CX ;余数DX,商AXCMP DL,10JB hexout_SMALLERADD DL,07Hhexout_SMALLER:ADD DL,30HMOV [DI],DLDEC DIOR AX,AXJNE hexout_AGAININC DIMOV DX,DI 输出处理结果MOV AH,9INT 21Hrethexout endpcode endsend main ;程序主函数入口3)输入一个十进制的个位数,求出这个数的平方值,显示其十进制结果,要求有如下提示信息。

微机原理与嵌入式系统实验6代码资料

微机原理与嵌入式系统实验6代码资料

微机原理与嵌入式系统实验指导书北京联合大学信息学院2014.4实验一DOS环境下的汇编语言编程环境使用(基础与验证型)一、实验要求和目的1、掌握汇编语言程序设计的基本方法和技能;2、熟练掌握使用全屏幕编辑程序EDIT 编辑汇编语言源程序;3、熟练掌握宏汇编程序MASM 的使用;4、熟练掌握连接程序LINK 的使用。

二、软硬件环境1、硬件环境:微机CPU 486 以上,500MB 以上硬盘,32M 以上内存;2、软件环境:装有MASM 6.0 、DEBUG 、LINK 、EDIT 等应用程序。

三、实验涉及的主要知识单元1、汇编语言源程序的汇编过程汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII 码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3 个文件:扩展名为.OBJ 的目标文件、扩展名为.LST 的列表文件和扩展名为.CRF 的交叉索引文件。

目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址。

列表文件(.LST)中包含了源程序的全部信息(包括注释)和汇编后的目标程序,列表文件可以打印输出,可供调试检查用。

交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。

.LST 和.CRF 两个文件不是必须建立的,可有有无,可以通过汇编时的命令加以选择。

在对源程序文件(ASM 文件)汇编时,汇编程序将对ASM 文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ 文件。

因此,汇编程序的主要功能可以概括为以下三点:(1)检查源程序中的语法错误,并给出错误信息;(2)产生目标程序文件(OBJ 文件),并可给出列表文件(.LST 文件);(3)展开宏指令。

微机原理实验程序设计集锦.

微机原理实验程序设计集锦.

实验一(1)1.将给定的一个二进制数,转换成二-十进制(BCD)码:要求将AX拆为三个BCD码,并存入result开始的三个单元。

data segment result db 3 dup(? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov ax,345 mov cl,100 div cl mov result,al mov al,ah mov ah,0 mov cl,10 div cl movresult+1,al mov result+2,ah jmp $ code ends end start (2)2.将给定的一个BCD数,将其转换成ASCII值:将AX拆为两个ASCII码,并存入result开始的两个单元data segment result db 2 dup(? ASCIIab: db"0123456789ABCDEF" data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov ax,23h mov bl,al shr bl,4 mov bh,0 mov ah,byte ptr ASCIIab[bx] mov result,ah or al,00h mov bl,al mov ah,byte ptr ASCIIab[bx] mov result+1,ah jmp $ code ends end start 实验二(1)742451.利用板上的集成电路插座,扩展一片74LS245,来读入开关状态。

data segment result db 3 dup(? data ends code segment assume cs:code start:mov dx,200h in al,dx not al mov dx,208h out dx,al jmp start code ends end start (2)74273。

微机原理考试提纲

微机原理考试提纲

1、LEN EQU 10SUM EQU 21HBLOCK EQU 22HCLR AMOV R7,#LENMOV R0,#BLOCKLOOP:ADD A,@R0INC R0DJNZ R7,LOOPMOV SUM,AEND该程序的功能是,把BLOCK单元开始存放的10个无符号数进行求和,并将结果存入SUM单元中。

2、将1位十六进制数转换成相应的ASCII码。

设十六进制数存放在R0中,转换后的ASCII 码存放于R2中。

实现程序如下:HASC:MOV A,R0 ;取4位二进制数ANL A,#0FH ;屏蔽掉高4位PUSH ACC ;4位二进制数入栈CLR C ;清进(借)位位SUBB A,#0AH ;用借位位的状态判断该数在0~9还是A~F之间POP ACC ;弹出原4位二进制数JC LOOP ;借位位为1,跳转至LOOPADD A,#07H ;借位位为0,该数在A~F之间,加37H LOOP:ADD A,#30H ;该数在0~9之间,加30HMOV R2,A ;ASCII码存于R2RET3、双字节无符号数加法。

设被加数存放在内部RAM的51H、50H单元,加数存放在内部RAM的61H、60H单元,相加的结果存放在内部RAM的51H、50H单元,进位存放在位寻址区的00H位中。

程序段如下:MOV R0,#50H ;被加数的低字节地址MOV R1,#60H ;加数的低字节地址MOV A,@R0 ;取被加数低字节ADD A,@R1 ;加上加数低字节MOV @R0,A ;保存低字节相加结果INC R0 ;指向被加数高字节INC R1 ;指向加数高字节MOV A,@R0 ;取被加数高字节ADDC A,@R1 ;加上加数高字节(带进位加)MOV @R0,A ;存高字节相加结果MOV 00H,C ;保存进位。

4、设变量x 以补码的形式存放在片内RAM的30H单元,变量y 与x 的关系是:当x 大于0时,y =x;当x =0时,y =20H;当x 小于0时,y =x+5。

微机原理实验代码

微机原理实验代码

CHECK MACRO CODE,COMPAREMOV AL,0000&CODE&BMOV DX,PORTOUT DX,ALMOV DX,PORT+1IN AL,DXLEA BX,TAB&COMPARECMP AL,0FHJNE DISPLAYENDMDATA SEGMENTMESSAGE DB 'PLEASE INPUT ANYKEY FROM KEYBOARD, PRESS F FOR END.',0DH,0AH,'$' TAB1 DB 'F', 'E', 'D', 'C'TAB2 DB 'B', 'A', '9', '8'TAB3 DB '7', '6', '5', '4'TAB4 DB '3', '2', '1', '0'KB DB 00EH, 00DH,00BH,007HPORT EQU 280HDATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV DX,PORT+3 ;初始化8255MOV AL,10000010bOUT DX,ALLEA DX,MESSAGEMOV AH,09HINT 21HSEARCH:MOV AL,0 ;若有键按下,按列查找哪个键MOV DX,PORTOUT DX,ALMOV DX,PORT+1IN AL,DXAND AL,0FHCMP AL,0FHJE SEARCHCHECK 1110,1 ;查找按下的键,并显示CHECK 1101,2CHECK 1011,3CHECK 0111,4NOPJMP SEARCHDISPLAY:MOV DI,BX ;存小键盘扫描码LEA SI,KBNEXT:CMP AL,[SI] ;查键盘扫描码表JE SHOW ;找到了,转去显示INC SI ;否则继续INC DIJMP NEXTSHOW: ;显示键入字符MOV AH,02HMOV DL,[DI]INT 21HCMP DL,'F' ;若是'F'则退出JE OVERCALL DELAYJMP SEARCH ;重新开始查询OVER:MOV AH,4CHINT 21HDELAY PROC ;延时循环100*65536次PUSH DIPUSH CXMOV CX,0FHXOR DI,DIAGAIN:NOPDEC DIJNZ AGAINDEC CXJNZ AGAINPOP CXPOP DIRETDELAY ENDPCODE ENDSEND STARTSET8253 MACRO SEGCODE,SEGOFFSETMOV AL,SEGCODE&BMOV DX,P8253+3 ;;工作在模式3OUT DX,ALMOV AX,3E8HMOV DX,P8253+&SEGOFFSETOUT DX,ALMOV AL,AH ;;先赋高八位再赋低八位OUT DX,ALENDMLIGHTUP MACRO DIGIT,SELECTLOCAL DELAYMOV DL,DIGIT ;;选择位MOV DH,0MOV SI,DXMOV AL,[BX][SI]MOV DX,P8255+1 ;;点亮LEDOUT DX,ALMOV AL,0000&SELECT&BMOV DX,P8255+2 ;;PC输出选通信号OUT DX,ALPUSH CXMOV CX,00F00H ;;延时DELAY: LOOP DELAYPOP CXXOR AX,AXMOV DX,P8255+2 ;;PC输出选通信号OUT DX,ALENDMDATA SEGMENTLED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH SEC1 DB 0SEC2 DB 5MIN1 DB 9MIN2 DB 5P8259 EQU 20HP8255 EQU 288HP8253 EQU 280HOLD_0A DW 0,0 ;原中断向量OLD_8259 DB 0DATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP (0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATASTART:MOV AX,DATAMOV DS,AXCLISET8253 00110110,0SET8253 01110110,1PUSH ES ;设置中断向量表PUSH BXMOV AL,0BH ;保护原中断向量,0B中断类型号MOV AH,35HINT 21H ;读中断向量表MOV OLD_0A+2,ES ;ES为段地址,BX为段偏移地址MOV OLD_0A,BXPOP BXPOP ESPUSH DSMOV AL,0BH ;写新中断向量MOV AH,25HMOV DX,SEG INT_0AMOV DS,DXMOV DX,OFFSET INT_0AINT 21HPOP DSMOV AL,10000000B ;对8255进行设置,PB/PC输出MOV DX,P8255+3OUT DX,ALIN AL,P8259+1 ;8259奇地址,中断向量屏蔽MOV OLD_8259,AL ;字设置保护原屏蔽字AND AL,11110111B ;开IRQ3OUT P8259,ALSTI ;开中断PLAY:LEA BX,LED ;LED段码LIGHTUP SEC1,0001LIGHTUP SEC2,0010LIGHTUP MIN1,0100LIGHTUP MIN2,1000JMP PLAYMOV AH,4CHINT 21HINT_0A PROC NEAR ;中断服务子程序CMP SEC1,9JZ INT1INC SEC1JMP EXITINT1:MOV SEC1,0INC SEC2CMP SEC2,6JNZ EXITMOV SEC2,0INC MIN1CMP MIN1,10JNZ EXITMOV MIN1,0INC MIN2CMP MIN2,6JNZ EXITMOV MIN2,0EXIT:MOV AL,20HOUT 20H,ALIRETINT_0A ENDPCODE ENDSEND STARTTRANSSET MACRO ADDRESS,ALNUMMOV DX,ADDRESSMOV AX,ALNUMOUT DX,ALENDMDATA SEGMENTFILE DB 'D:\abc.TXT',0FCODE DW 0BUF DB 2000H DUP(0)DATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)STACK ENDSCODE SEGMENTASSUME CS: CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXTRANSSET 3FBH,80H ;传输线路控制寄存器,寻址除数锁存器TRANSSET 3F8H,60H ;DLLTRANSSET 3F9H,0 ;DLHTRANSSET 3FBH,1AH ;传输线路控制寄存器,LCR地址,7位数据,1位停止TRANSSET 3FCH,03H ;MODEM控制寄存器TRANSSET 3F9H,0 ;屏蔽中断MOV AH,3DH ;文件操作LEA DX,FILEMOV AL,2INT 21HMOV FCODE,AXXOR SI,SIRECEIVE:MOV DX,3FDH ;检测接收数据是否准备好IN AL,DXTEST AL,01HJZ RECEIVEMOV DX,3F8HIN AL,DXMOV DL,ALMOV AH,02INT 21HSEND:MOV DX,3FDH ;检测接收数据是否准备好IN AL,DXTEST AL,20HJZ SENDMOV AH,3FH ;从文件中读取发送LEA DX,BUFADD DX,SIMOV BX,FCODEMOV CX,1INT 21HMOV DX,3F8HMOV AL,BUF[SI]OUT DX,ALINC SI;MOV DL,AL;MOV AH,02 ;将字符显示在屏幕上;INT 21HREPT 45NOPENDMJMP RECEIVECODE ENDSEND STARTTRANSSET MACRO ADDRESS,ALNUMMOV DX,ADDRESSMOV AX,ALNUMOUT DX,ALENDMDATA SEGMENTFILE DB 'D:\abc.TXT',0FCODE DW 0BUF DB 2000H DUP(0)IO8254A EQU 280HIO8251A EQU 2B8HIO8251B EQU 2B9HDATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXTRANSSET IO8254A+3,00010110B ;设置8254计数器0工作方式,低字节,8位,方式3,二进制TRANSSET IO8254A,52 ;给8254计数器0送初值(波特率1200,因子16,计数初值52)TRANSSET IO8251B,0 ;初始化8251TRANSSET IO8251B,40H ;向8251控制端口送40H,使其复位TRANSSET IO8251B,7EH ;设置为1个停止位,8个数据位,波特率因子为16 TRANSSET IO8251B,27H ;向8251送控制字允许其发送和接收MOV AH,3CH ;文件操作LEA DX,FILEMOV CX,00INT 21HMOV FCODE,AXMOV AH,3DHLEA DX,FILEMOV AL,2INT 21HXOR SI,SISEND:MOV DX,IO8251BIN AL,DXTEST AL,20H ;发送是否准备好JZ SENDMOV DX,IO8251AMOV AL,'F'OUT DX,AL ;发送;MOV DL,AL;MOV AH,02 ;将字符显示在屏幕上;INT 21HREPT 64NOPENDMRECEIVE:MOV DX,IO8251BIN AL,DXTEST AL,01 ;检查接收是否准备好JZ RECEIVE ;没有,等待MOV DX,IO8251AIN AL,DX ;准备好,接收MOV DL,ALMOV AH,02 ;将接收到的字符显示在屏幕上INT 21HMOV BUF[SI],DLMOV AH,40H ;接收到的字符写入文件LEA DX,BUFADD DX,SIMOV BX,FCODEMOV CX,1INT 21HINC SIREPT 45NOPENDMJMP SENDMOV AH,4CHINT 21HCODE ENDS END STARTDATA SEGMENTINT0B DW 2 DUP(?)IMR DB ?P_AD DW 298HTAB DB '0123456789ABCDEF'DATA ENDSS SEGMENT STACK 'STACK'DB 128 DUP(?)S ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:SMAIN PROC PARMOV AX,DATAMOV DS,AXCLI;修改中断向量表PUSH ESPUSH BXMOV AH,35H ;保护原中断向量MOV AL,0BHINT 21HMOV INT0B,ESMOV INT0B+2,BXPOP BXPOP ESPUSH DSPUSH DXMOV DX,OFFSET DISP ;设置新的中断向量PUSH BXMOV BX,SEG DISPMOV DS,BXPOP BXMOV AX,250BHINT 21HPOP DXPOP DS;8259清除0BH号中断屏蔽位IN AL,21HMOV IMR,ALAND AL,0F7HOUT 21H,AL;启动AD转换NEXT: MOV DX,P_ADMOV AL,0OUT DX,AL;等待中断,并检测是否有按键PUSH CXMOV CX,100LOOP $POP CXSTIMOV AH,1INT 16HJZ NEXT;恢复8259中断屏蔽位CLIMOV AL,IMROUT 21H,AL;恢复中断向量表PUSH DXPUSH DSMOV DX,INT0BMOV DS,DXMOV DX,INT0B+2MOV AX,250BHINT 21HPOP DSPOP DXMOV AX,4C00HINT 21HMAIN ENDPDISP PROC FARPUSH AXPUSH DXMOV DX,P_AD ;读入AD转换结果IN AL,DXMOV AH,0 ;AH中为低位,AL中为高位SHL AX,4SHR AL,4PUSH AX ;输出高位MOV AL,AHLEA BX,TABXLATBMOV DL,ALMOV AH,2INT 21HPOP AXLEA BX,TAB ;输出低位XLATBMOV DL,ALMOV AH,2INT 21HMOV DL,0DH ;输出回车MOV AH,2INT 21HMOV DL,0AH ;输出回车MOV AH,2INT 21HMOV AL,20HOUT 20H,ALPOP DXPOP AXIRETDISP ENDPCODE ENDSEND MAINDATA SEGMENTADD_DA DW 290HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,ADD_DAMOV AL,0NEXT: OUT DX,AL ;向DA送数据ADD AL,10MOV CX,5 ;延时LOOP $MOV AH,1 ;检测按键INT 16HJZ NEXTMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAINDATA SEGMENTADD_DA DW 290HLEN DB 32DATA_IN DB 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hdb 80h,66h,4eh,38h,25h,15h,09h,04hdb 00h,04h,09h,15h,25h,38h,4eh,66hDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,ADD_DABEGIN: MOV BH,LENLEA SI,DATA_INNEXT: MOV AL,[SI]OUT DX,AL ;向DA送数据INC SIDEC BHMOV CX,1 ;延时LOOP $CMP BH,0 ;一个周期已完成JZ BEGINMOV AH,1 ;检测按键INT 16HJZ NEXTMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAIN。

《微机原理与接口技术》实训程序代码

《微机原理与接口技术》实训程序代码

实训1 排序程序设计六.参考代码DATA SEGMENTDW 0055H,0033H,0066H, 0077H,0099H, 0011H, 0022H, 0088H, 0044H, 0000HDATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXMOV CX, 9LOOP1: MOV DX, CXMOV BX, 0LOOP2: MOV AX, [BX]INC BXINC BXCMP AX,[BX]JLE DONE ;小于或等于转移XCHG [BX], AXDEC BXDEC BXMOV [BX], AXINC BXINC BXDONE: DEC DXJNE LOOP2LOOP LOOP1MOV AX, 4C00HINT 21HCODE ENDSEND START实训二8259A外部中断六.参考代码CS273 equ 8000HICW1 euq 00010011b ; 单片8259, 上升沿触发中断, 写ICW4 ICW2 equ 00100000b ; 中断号为20HICW4 equ 00000001b ; 工作在8086/88 方式OCW1 equ 11111110b ; 只响应IR0CS8259A equ 0A000hCS8259B equ 0A001hdata segmentCNT db 0data endscode segmentasumme cs:code,ds:dtaienter proc nearpush axpush dxmov dx, CS273inc CNTmov al, CNTout dx, al ;输出计数值mov dx, CS8259Amov al, 20hout dx, alpop dxpop axiretienter endpiinit procmov dx, CS8259Amov al, ICW1out dx, almov dx, CS8259Bmov al, ICW2out dx, almov al, ICW4out dx, almov al, OCW1out dx, alretiinit endpstart proc nearclimov ax, 0mov ds, axmov bx, 4*ICW2mov ax, code ;mov ax, offset ienter;中断入口地址(段地址为0) mov [bx], axmov ax, 0inc bxinc bxmov [bx], ax ;代码段地址为0call iinitmov ax, datamov ds, axmov CNT, 0 ;计数初值为 0mov al, CNTmov dx, CS273out dx, alstiLP: nop ;等待中断jmp LPstart endpcode endsend start实训三8255输入/输出七.参考代码mode equ 082h ; 方式0,PA,PC输出,PB输入PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址code segmentassume cs:codestart proc nearStart: mov al, modemov dx, CAddrout dx, al ; 输出控制字mov al, 80Hmov cx, 08HOutA: mov dx, PortAout dx, al ; 输出PortA mov dx, PortCout dx, alshr al, 1 ; 移位mov ah,100call delay ; 延时loop OutAdelay proc nearpush axmov al,0push cxmov cx,axloop $pop cxpop axretdelay endpcode endsenf start实训4 8251A串行通讯CS8251C equ 8001hdata segmentsource db 256 dup(055h)target db 256 dup(0aah)RBuf db 0TBuf db 0data endscode segmentassume cs:code,ds:dataIInit proc near ;8251初始化mov dx, CS8251Cmov al, 01001111b;1位停止位,无校验,8位数据,波特率因子64out dx, almov al, 00010101b;清除错标志,允许发送接收retIInit endpsend proc near ;串口发送mov dx, CS8251Cmov al, 00010101bout dx, alWaitTXD:in al, dxtest al, 1 ;发送缓冲器是否为空jz WaitTXDmov al, TBuf ;取要发送的字mov dx, CS8251Dout dx, al ;发送数据retsend endpreceive proc near ;串行接收mov dx, CS8251CWaitRXD:in al, dxtest al, 2 ;是否已收到一个字je WaitRXDmov dx, CS8251Din al, dx ;读取接收的字mov RBuf , alretreceive endstart proc nearmov ax, datamov es, axmov si, offset sourcemov di, offset targetmov cx, 256mov ds, axcall IInitMLoop:mov dx, CS8251Cin al, dx ;是否接收下一个字 test al, 2jne rcvdatacmp cx, 0je MLoopmov al, [si]inc simov Tbuf, alcall sandloop MLoopjimp MLooprcvdata:call receive ;读入接收的字mov al, RBufmov [di], alinc dijmp MLoopstart endpcode endsend实训5 8253计数器七.参考代码CONTROL equ 08003hCOUNT0 equ 08000hCOUNT1 equ 08001hCOUNT2 equ 08002hcode segmentassume cs:codetart proc nearmov al, 36h; 00110110B ; 计数器0,16位,方式3,二进制 mov dx, CONTROLout dx, almov ax, 10000mov dx, COUNT0out dx, al ; 计数器低字节mov al, ahout dx, al ; 计数器高字节mov al, 76h; 01110110B ; 计数器1,16位,方式3,二进制 mov dx, CONTROLout dx, almov ax, 100mov dx, COUNT1out dx, al ; 计数器低字节mov al, ahout dx, al ; 计数器高字节jmp $start endpcode endsend start实训6 交通灯控制六.参考代码app macro yy ;控制显示宏指令mov dx, 03c1hmov al, yyout dx, almov cx, 00d0hcall delayendmfres macro xx,yy ;控制闪烁宏指令app xxapp yyendmts macro xx ;控制测试宏指令mov dx, 03c0hin al, dxtest al, xxendmcode segmnet stack ‘stack’mag db ‘out of wok!’,0ah,0dh,24hassume ds:code,cs:code,es:code,ss:codestart: mov ax, csmov ds, axmov es, axmov ss, axmov al, 90hmov dx, 3c3hout dx, al ;置8255a方式字,使A口输入,B口输出call zjdncall fjdngo: app 0ch ;主干道通行mov cx, 40hb0: push cxcall zjdncall fjdnapp 0chpop cxloop b0mov cx, 00d0hcall delaycall czf ;从主干道通行变为支通行call zjdncall fjdncall czfapp 21h ;支路通行mov cx, 20hcall zjdnapp 21hpop cxloop b2call cfz ;从支路通行变为主干道通行call zjdncall fjdncall cfzmov ah, 01hint 16hzj againjnz exit ;有键盘输入,结束运行again: jmp goexit: mov ah, 09hmov dx, offset msgint 21hmov ah, 4dhint 21hzjdn proc near ;检测主干道特种车子程序,一旦有就放行push cxts 01bjz p1mov dx, 03c1hin al, dxtest al, 21hjz s1call cfzs1: app 0chmov cx, 0200hcall delayp1: pop cxretzjdn endpfjdn proc near ;检测支路特种车子程序,如有且主干道无才放行 push cxjz ffcall zjdnff: ts 02hjz p2mov dx, 03c1hin al, dxtest al, 0chjz s2call czfs2: app 21hmov cx, 0200hcall delayp2: pop cxretfjdn endpdelay proc ;延时子程序d2: mov ax, 0100hdela: dec axjnz delaloop d2retdelay endpcfz proc nearpush cxmov bx, 03hw3: fres 11h,10hdec bxjnz w3pop cxretcfz endpczf proc near ;从主干道通行变为支路通行 push cxmov bx, 03hw1: fres oah, 02hdec bxjnz w1pop cxretczf endpdb 200dup(?) end start。

微机试验1-5实验代码

微机试验1-5实验代码

实验01_IO地址译码ioport equ 0d400h-0280houtport1 equ ioport+2a0houtport2 equ ioport+2a8hcode segmentassume cs:codestart:mov dx,outport1out dx,alcall delay ;调延时子程序mov dx,outport2out dx,alcall delay ;调延时子程序mov ah,1int 16hje startmov ah,4chint 21hdelay proc near ;延时子程序mov bx,2000lll: mov cx,0ll: loop lldec bxjne lllretdelay endpcode endsend start简单并行接口74LS244ioport equ 0d400h-0280hls244 equ ioport+2a0hcode segmentassume cs:codestart:mov dx,ls244 ;从2A0输入一数据in al,dxmov dl,al ;将所读数据保存在DL中mov ah,02int 21hmov dl,0dh ;显示回车符int 21hmov dl,0ah ;显示换行符int 21hmov ah,06 ;是否有键按下mov dl,0ffhint 21hjnz exitje start ;若无,则转startexit: mov ah,4ch ;返回DOSint 21hcode endsend start简单并行接口74LS273ioport equ 0b800h-0280hls273 equ ioport+2a8hcode segmentassume cs:codestart:mov ah,2 ;回车符mov dl,0dhint 21hmov ah,1 ;等待键盘输入int 21hcmp al,27 ;判断是否为ESC键je exit ;若是则退出mov dx,ls273 ;若不是,从2A8H输出其ASCII码out dx,aljmp start ;转startexit: mov ah,4ch ;返回DOSint 21hcode endsend start可编程定时器计数器8253(一)ioport equ 0d400h-0280hio8253a equ ioport+283hio8253b equ ioport+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 ;首先取低四位mov dl,alcmp 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可编程并行接口(8255方式0)ASMioport equ 0b800h-0280hio8255a equ ioport+288hio8255b equ ioport+28bhio8255c equ ioport+28ahcode segmentassume cs:codestart: mov dx,io8255b ;设8255为C口输入,A口输出mov al,8bhinout: mov dx,io8255c ;从C口输入一数据in al,dxmov dx,io8255a ;从A口输出刚才自C口out dx,al ;所输入的数据mov dl,0ffh ;判断是否有按键mov ah,06hint 21hjz inout ;若无,则继续自C口输入,A口输出mov ah,4ch ;否则返回DOSint 21hcode endsend start七段数码管静态显示data segmentioport equ 0d400h-0280hio8255a equ ioport+288hio8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$' data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;使8255的A口为输出方式mov ax,80hout dx,alsss: mov dx,offset mesg1 ;显示提示信息mov ah,09hint 21hmov ah,01 ;从键盘接收字符int 21hcmp al,'0' ;是否小于0jl exit ;若是则退出cmp al,'9' ;是否大于9jg exit ;若是则退出sub al,30h ;将所得字符的ASCII码减30Hmov bx,offset led ;bx为数码表的起始地址xlat ;求出相应的段码mov dx,io8255a ;从8255的A口输出jmp sss ;转SSSexit: mov ah,4ch ;返回DOSint 21hcode ends七段数码管动态显示data segmentioport equ 0d400h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位bz dw ? ;位码data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;将8255设为A口输出mov al,80hout dx,almov di,offset buffer1 ;设di为显示缓冲区loop2: mov bh,02lll: mov byte ptr bz,bhpush didec diadd di, bzmov bl,[di] ;bl为要显示的数pop dimov al,0mov dx,io8255aout dx,almov bh,0mov si,offset led ;置led数码表偏移地址为SI add si,bx ;求出对应的led数码mov al,byte ptr [si]mov dx,io8255c ;自8255A的口输出out dx,almov al,byte ptr bz ;使相应的数码管亮mov dx,io8255amov cx,3000delay: loop delay ;延时mov bh,byte ptr bzshr bh,1jnz lllmov dx,0ffhmov ah,06int 21hje loop2 ;有键按下则退出mov dx,io8255amov al,0 ;关掉数码管显示out dx,almov ah,4ch ;返回int 21hcode endsend start。

微机原理与接口技术实验报告-全实例代码

微机原理与接口技术实验报告-全实例代码

实验一上机练习实验目的:1、掌握用编辑软件编辑程序文本的方法。

在DOS环境下,熟练掌握用MASM5.0宏汇编程序对ASM文件进行编译、连接等操作步骤。

2、熟悉用DEBUG调试程序。

实验要求:选取教科书中一典型例题,用编辑软件在PC机中形成ASM文件,然后编译、连接,生成目标文件和可执行文件。

再用DEBUG程序进行调试。

实验步骤:实验程序如下:data segmentary1 db 12,34,45,56,67,78,89,90,18cont1 equ $-ary1 ;ary1的长度sum1 dw ?ary2 db 13h,24h,57h,68h,9ah,0bch,0cdh,0deh,80h,50hcont2 equ $-ary2sum2 dw ?data endscode segmentassume cs:code, ds:datastart: mov ax,datamov ds,axlea si,ary1mov cx,cont1 ;设定循环次数为ary1的个数call sumlea si,ary2mov cx,cont2call summov ah,4ch ;结束程序功能调用4CHint 21hsum proc ;求和程序段,求该段所有数之和xor ax,ax ;ax清零为下面加法准备next1: add al,[si]adc ah,0inc siloop next1mov [si],axret ;返回调用程序sum endp ;程序段结束code endsend start点击“运行”点击“编译成目标文件”,编译成功后,再“运行”=〉“生成可执行文件”,然后运行,即可。

运行成功以后,可进行调试。

点击工具栏的调试按钮,出现调试框。

其命令如下:输入a,进行逐行汇编,输入c,比较两内存块,输入d,内存信息以16进制显示;输入e,修改内存指定的字节;输入f,可以预置一段内存;输入g,执行程序;输入h,制算术运算;输入i,从指定端口地址输入;输入l,读盘;输入m,内存块传送;输入n,置文件名;输入o,从指定端口地址输出;输入q,结束DEBUG调试;输入r,显示和修改寄存器;输入s,查找字节串;输入t,跟踪执行;输入u,反汇编;输入w,存盘操作。

微机原理实验8237,8251,8253,8255,8259程序精华版

微机原理实验8237,8251,8253,8255,8259程序精华版

8237实验程序.MODEL TINYDMAaddr EQU 0E000H ;8237基地址.STACK 100.CODESTAR: MOV AX,0MOV DS,AXmov si,3000hmov al,0ffhmov cx,0800hSTAR3: mov [si],alinc sidec alloop STAR3mov al,04hmov dx,DMAaddr+8out dx,al ;禁止DMA操作mov al,00mov dx,DMAaddr+0dhout dx,al ;复位mov dx,DMAaddr+0chout dx,al ;清除先/后寄存器; mov dx,3000h ;源启始地址3000H mov dx,DMAaddr+00hout dx,almov al,30hout dx,almov al,00mov dx,DMAaddr+0chout dx,al ;清除先/后寄存器; mov dx,6000h ;目的启始地址6000Hmov dx,DMAaddr+02hout dx,almov al,60hout dx,almov al,00mov dx,DMAaddr+0chout dx,al ;清除先/后寄存器mov dx,DMAaddr+03hmov ax,7ffh ;长度0800Hout dx,almov al,ahout dx,almov dx,DMAaddr+0bhmov al,88hout dx,al ;通道0方式字mov al,85hout dx,al ;通道1方式字mov dx,DMAaddr+8mov al,41hout dx,al ;允许8237工作、存贮器方式传送star1: mov dx,DMAaddr+0fhmov al,0chout dx,al ;允许通道0、通道1mov dx,DMAaddr+09hmov al,04hout dx,al ;允许DMA操作mov dx,DMAaddr+08hNOPNOPstar2: in al,dxTEST AL,03Hjz star2 ;等待DMA结束mov dx,DMAaddr+0dhin al,dx ;读暂存寄存器mov dx,DMAaddr+0chout dx,almov dx,DMAaddr+3 ;清除先/后寄存器IN AL,DXMOV AH,ALIN AL,DXCMP AX,0FFFFHJNZ star1mov dx,DMAaddr+09hmov al,00hout dx,al ;清除DMA请求mov dx,DMAaddr+08hmov al,04hout dx,al ;禁止DMA操作mov dx,DMAaddr+0dhin al,dx ;读暂存寄存器mov si,3000hmov bx,6000hmov cx,0800hSTAR5: mov al,[si]cmp al,ds:[bx]jne falseinc siinc bxloop STAR5true: jmp $false: jmp $END STAR////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8251实验程序.MODEL TINY;使用8253的计数器0,外接2Mhz,经26分频后,送给8251,产生4800bpsCTL_ADDR EQU 0FF01H ;控制字或状态字DA TA_ADDR EQU 0FF00H ;读写数据W_8253_T0 EQU 0BF00H ;计数器0地址W_8253_C EQU 0BF03H ;控制字.STACK 100.DATAReceive_Buffer DB 10 DUP(0) ;接受缓冲器Send_Buffer EQU Receive_Buffer ;发送缓冲器.CODESTART: MOV AX,@DA TAMOV DS,AXMOV ES,AXNOPCALL INIT_8253CALL INIT_8251START1: MOV CX,10CALL Receive_GroupMOV CX,10CALL Send_GroupJMP START1INIT_8253 PROC NEARMOV DX,W_8253_CMOV AL,37H ;定时器0,方式3OUT DX,ALMOV DX,W_8253_T0MOV AL,26H ;BCD码26(2000000/26)=16*4800OUT DX,ALMOV AL,0OUT DX,ALRETINIT_8253 ENDPINIT_8251 PROC NEARCALL RESET_8251MOV DX,CTL_ADDR;?MOV AL,7EH;? ;波特率系数为16,8个数据位OUT DX,AL;? ;一个停止位,偶校验CALL DLTIME ;延时MOV AL,15H;? ;允许接收和发送发送数据,清错误标志OUT DX,AL;?CALL DLTIMERETINIT_8251 ENDPReset_8251 PROC NEARMOV DX,CTL_ADDRMOV AL,0OUT DX,AL ;向控制口写入"0"CALL DLTIME ;延时,等待写操作完成OUT DX,AL ;向控制口写入"0"CALL DLTIME ;延时OUT DX,AL ;向控制口写入"0"CALL DLTIME ;延时MOV AL,40H ;向控制口写入复位字40HOUT DX,ALCALL DLTIMERETReset_8251 ENDP;接受一组数据,CX--接受数目Receive_Group PROC NEARLEA D I,Receive_BufferReceive_Group1: CALL Receive_ByteSTOSBLOOP Receive_Group1RETReceive_Group ENDP;接受一个字节Receive_Byte PROC NEARMOV DX,CTL_ADDRReceive_Byte1:IN AL,DX;? ;读入状态TEST AL,2;?JZ Receive_Byte1;? ;有数据吗?MOV DX,DATA_ADDR;?IN AL,DX;?RETReceive_Byte ENDP;发送一组数据,CX--发送数目Send_Group PROC NEARLEA S I,Send_BufferSend_Group1:LODSB ;?CALL Sendbyte;?LOOP Send_Group1;?RETSend_Group ENDP;发送一个字节Sendbyte PROC NEARPUSH AXMOV DX,CTL_ADDR ;读入状态Sendbyte1: IN AL,DX;?TEST AL,1;?JZ Sendbyte1;? ;允许数据发送吗?POP AX;? ;发送MOV AX,DA TA_ADDR;?OUT DX,AL;?RETSendbyte ENDP;延时DLTIME PROC NEARMOV CX,10LOOP $RETDLTIME ENDPEND START////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8253实验程序.MODEL TINYCOM_ADDR EQU 0B003HT0_ADDR EQU 0B000HT1_ADDR EQU 0B001H.STACK 100.CODESTART: MOV DX,COM_ADDRMOV AL,35HOUT DX,AL ;计数器T0设置在模式2状态,BCD码计数MOV DX,T0_ADDRMOV AL,00HOUT DX,ALMOV AL,10HOUT DX,ALMOV DX,COM_ADDRMOV AL,77HOUT DX,ALMOV DX,T1_ADDRMOV AL,00HOUT DX,ALMOV AL,10HOUT DX,ALJMP $ ;OUT1输出频率为1S的方波END START////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8255实验程序.MODEL TINYCOM_ADD EQU 0F003HPA_ADD EQU 0F000HPB_ADD EQU 0F001HPC_ADD EQU 0F002H.STACK 100.DATALED_Data DB 01111101B ;东西绿灯,南北红灯DB 11111101B ;东西绿灯闪烁,南北红灯DB 10111101B ;东西黄灯亮,南北红灯DB 11010111B ;东西红灯,南北绿灯DB 11011111B ;东西红灯,南北绿灯闪烁DB 11011011B ;东西红灯,南北黄灯亮.CODESTART: MOV AX,@DA TAMOV DS,AXNOPMOV DX,COM_ADDMOV AL,80H ;PA、PB、PC为基本输出模式OUT DX,ALMOV DX,PA_ADD ;灯全熄灭MOV AL,0FFHOUT DX,ALLEA B X,LED_DataSTART1: MOV AL,0XLATOUT DX,AL ;东西绿灯,南北红灯CALL DL5SMOV CX,6START2: MOV AL,1XLATOUT DX,AL ;东西绿灯闪烁,南北红灯CALL DL500msMOV AL,0XLATOUT DX,ALCALL DL500msLOOP START2MOV AL,2 ;东西黄灯亮,南北红灯XLATOUT DX,ALCALL DL3SMOV AL,3 ;东西红灯,南北绿灯XLATOUT DX,ALCALL DL5SMOV CX,6START3: MOV AL,4 ;东西红灯,南北绿灯闪烁XLATOUT DX,ALCALL DL500msMOV AL,3XLATOUT DX,ALCALL DL500msLOOP START3MOV AL,5 ;东西红灯,南北黄灯亮XLATOUT DX,ALCALL DL3SJMP START1DL500ms PROC NEARPUSH CXMOV CX,60000DL500ms1: LOOP DL500ms1POP CXRETDL500ms ENDPDL3S PROC NEARPUSH CXMOV CX,6DL3S1: CALL DL500msLOOP DL3S1POP CXRETENDPDL5S PROC NEARPUSH CXMOV CX,10DL5S1: CALL DL500msLOOP DL5S1POP CXRETENDPEND START////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8259实验程序.MODEL TINYEXTRN Display8:NEARIO8259_0 EQU 0F000HIO8259_1 EQU 0F001H.STACK 100.DATABUFFER DB 8 DUP(?)Counter DB ?ReDisplayFlagDB 0.CODESTART: MOV AX,@DA TAMOV DS,AXMOV ES,AXNOPCALL Init8259CALL WriIntverMOV Counter,0 ;中断次数MOV ReDisplayFlag,1 ;需要显示STI ;开中断START1: CMP ReDisplayFlag,0JZ START1CALL LedDisplayMOV ReDisplayFlag,0JMP START1Init8259 PROC NEARMOV DX,IO8259_0MOV AL,13HOUT DX,ALMOV DX,IO8259_1MOV AL,08HOUT DX,ALMOV AL,09HOUT DX,ALMOV AL,0FEHOUT DX,ALRETInit8259 ENDPWriIntver PROC NEARPUSH ESMOV AX,0MOV ES,AXMOV DI,20HLEA A X,INT_0STOSWMOV AX,CSSTOSWPOP ESRETWriIntver ENDPLedDisplay PROC NEARMOV AL,CounterMOV AH,ALAND AL,0FHMOV Buffer,ALAND AH,0F0HROR AH,4MOV Buffer + 1,AHMOV Buffer + 2,10H ;高六位不需要显示MOV Buffer + 3,10HMOV Buffer + 4,10HMOV Buffer + 5,10HMOV Buffer + 6,10HMOV Buffer + 7,10HLEA S I,BufferCALL Display8RETLedDisplay ENDPINT_0: PUSH DXPUSH AXMOV AL,CounterADD AL,1DAAMOV Counter,ALMOV ReDisplayFlag,1MOV DX,IO8259_0MOV AL,20HOUT DX,ALPOP AXPOP DXIRETEND START。

微机原理实验编程题(完整)

微机原理实验编程题(完整)

1)(正确)比较两个无符号数的大小(量个数放在内存S3的连续两个单元中),将大数存入MAX单元中。

DATAS SEGMENTBUF DB 1,2CNT EQU $-BUFDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV CX,CNT-1LEA BX,BUFMOV AL,[BX]L2: INC BXCMP AL,[BX]JAE L1MOV AL,[BX]L1:LOOP L2ADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND STAR2)(正确)试编一程序,求三个带符号数据中的最大值,并将最大值存入MAX单元中,设三个带符号数分别在三个变量X,Y,Z中存储。

DATAS SEGMENTX DB 5Y DB-2Z DB 0MAX DB?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV AL,XMOV BL,YCMP AL,BLJG L1MOV AL,BLL1:MOV BL,ZCMP AL,BLL2: MOV MAX,ALMOV AH,4CHINT 21HCODES ENDSEND START3)(正确)根据MODE单元中编号0-7分别转向L0-L7标号处,执行L0-L7处分别完成显示‘0-7’字符,即当MODE=0时,转向L0标号,完成显示‘0’,当MODE=7时,转向L7标号,完成显示‘7’。

DATAS SEGMENTMODE DB 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV AL,MODECMP AL,0JZ L0CMP AL,1JZ L1CMP AL,2JZ L2CMP AL,3JZ L3CMP AL,4JZ L4CMP AL,5JZ L5CMP AL,6JZ L6MOV DL,'7'MOV AH,02H INT 21H JMP L8L0:MOV DL,'0' MOV AH,02H INT 21H JMP L8L1:MOV DL,'1' MOV AH,02H INT 21H JMP L8L2:MOV DL,'2' MOV AH,02H INT 21H JMP L8L3:MOV DL,'3' MOV AH,02H INT 21H JMP L8L4:MOV DL,'4'MOV AH,02HINT 21HJMP L8L5:MOV DL,'5'MOV AH,02HINT 21HJMP L8L6:MOV DL,'6'MOV AH,02HINT 21HJMP L8L8:MOV AH,4CHINT 21HCODES ENDSEND START4)(正确)根据输入值(0-4)的不同,执行不同的操作,用转移标法编写程序。

微机原理实验(含解答程序)

微机原理实验(含解答程序)

微机原理实验程序(汇编程序可以使用MASM FOR WINDOWS)1.将偏移地址为2000h开始的100个单元依次设置为0~99。

STACKl SEGMENT STACK ;8088宏汇编程序DW 64 DUP(?) ;定义堆栈段STACKl ENDSCODE SEGMENTASSUME CS:CODE ;定义代码段START: MOV DI,[2000H] ;程序开始设数据区首址MOV CX,100 ;字节数送入cx中MOV AL,0000NEXT: MOV [DI],AL ;写入一字节INC DI ;修改地址指针INC BX ;修改数据INC ALDEC CXJNZ NEXTHLTCODE ENDS ;代码段结束END START ;程序结束2.将两个64位的二进制数相加,记录相加的和以及各个状态标志的值。

STACKl SEGMENT STACKDW 64 DUP (?) STACKl ENDSDATA SEGMENTXL1 DW 50HXL2 DW 12HXH1 DW 30HXH2 DW 25HYL1 DW 32HYL2 DW 55HYH1 DW 74HYH2 DW 32HDATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA START:MOV AX,DATAMOV DS,AXMOV AX,XL1ADD AX,YL1MOV BP,AXMOV AX,XL2ADD AX,YL2MOV SI,AXMOV AX,XH1ADD AX,YH2MOV DI,AXMOV AX,XH2ADD AX,YH2MOV DX,AXCODE ENDSEND START3. 编写程序,在屏幕上分行显示自己的姓名、学号。

datas segmentnam db 'name hu li hu tu$'num db 'number 20121201$'datas endsstacks segmentdw 100 dup(?)stacks endscodes segmentassume cs:codes,ds:datas,ss:stacksstart:mov ax,datasmov ds,axmov dx,offset nammov ah,9int 21hmov dl,0ahmov ah,2int 21hmov dl,0dhint 21hmov dx,offset nummov ah,9int 21hcode segment endsend start4. 编写程序,通过键盘输入0——9之间的一个数字,利用查表法计算其平方。

微机原理程序代码

微机原理程序代码

微机原理程序代码微机原理⼤作业题⽬及程序代码1、将AX寄存器中16位数分成4组,每组四位,然后把这四位数分别放在AL、BL、CL和DL中。

code segmentassume cs:codestart: mov ax,1234h;测试数据mov cl,4mov dx,axand dl,0fhand dh,0fhmov bl,dhmov bh,alror bh,cland bh,0fhmov ch,bhror ah,cland ah,0fhmov al,ahmov cl,chmov ah,4chint 21hcode endsend start1、试编写⼀程序,要求⽐较两个字符串STRING1和STRING2所含字符是否相同,若相同则显⽰“MATCH”,若不相同则显⽰“NOMATCH”。

DATA SEGMENTSTRING1 DB 'HELLO.'C1 EQU $-STRING1STRING2 DB 'HELLO!'C2 EQU $-STRING2S1 DB 'MATCH$'S2 DB 'NOMATCH$'ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,C1CMP SI,C2JNZ N_MMOV BX,0L1: MOV AL,STRING1[BX]CMP AL,STRING2[BX]JNZ N_MINC BXDEC SIJNZ L1MOV DX,OFFSET S1JMP EXITN_M: MOV DX,OFFSET S2EXIT: MOV AH,9INT 21HMOV AH,4CHINT 21HCODE ENDSEND START2、试编写⼀程序,要求能从键盘接收⼀个个位数N,然后响铃N 次。

CODE SEGMENTASSUME CS:CODESTART: ;MOV DL,7;MOV AH,2;INT 21HMOV AH,1INT 21HCMP AL,30HJBE EXITMOV CL,ALL1: MOV DL,07HMOV AH,2INT 21HMOV BX,1FFFH;延时L3: MOV DX,0FFFFHL2: DEC DXJNZ L2DEC BXJNZ L3DEC CLJNZ L1EXIT: MOV AH,4CHINT 21HCODE ENDSEND START3、编写程序,将⼀个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显⽰出来。

微机原理常用代码

微机原理常用代码

微机原理常⽤代码选择结构(简单分⽀程序设计)![img](file:///C:\Users\COOL·~1\AppData\Local\Temp\ksohtml24868\wps1.png)include io32.inc.data.codestart:call readuidcmp eax,0jge xge0imul eax,2jmp displayxge0:cmp eax,10jg xg10imul eax,3jmp displayxg10:imul eax,4display:call dispuidexit 0end start提⽰:采⽤伪代码描述如下:.datamsg1 byte 'is leap year', 13, 10, 0msg2 byte 'is not leap year', 13, 10, 0 .codestart :call readuidmov edx,0mov ecx,4div ecxcmp edx,0je s1jmp s2exit 0s1:mov edx,0mov ecx,100div ecxjne leapjmp s2s2:mov edx,0mov ecx,400div ecxje leapjmp noleapleap:mov eax,offset msg1call dispmsgexit 0noleap:mov eax,offset msg2call dispmsgexit 0end start.data ;setdata segmentyes byte '可以构成',0no byte '不能构成', 0dengbian byte '等边三⾓形',0dengyao byte '等腰三⾓形',0x dword ?y dword ?z dword ?fmt byte '%d %d %d',0fmts byte '%s',0.codemain procinvoke scanf,offset fmt,offset x,offset y,offset zmov eax,xadd eax,ymov ebx,xadd eax,zmov ecx,yadd ecx,zmov esi,x; 做运算时不能两个同为memory变量所以esimov edi,y.if(eax>z)&&(ebx>y)&&(ecx>x)invoke printf,offset fmts,offset yes; //如果是字符串⼀定要加offset .if(esi==y)&&(esi==z)invoke printf,offset fmts,offset dengbian.else if(esi==y||esi==z||edi==z)invoke printf,offset fmts,offset dengyao.endif.elseinvoke printf,offset fmts,offset no.endifretmain endpend main.datafmt bate 'sum=%d',0.codestart:mov eax,0mov ecx,1.while ecx<101add eax,ecxinc ecx.endwinvoke printf,offset fmt,eaxretend start//**思考题:假设双字为⽆符号整数,sum=1+2+...n,在和不溢出的情况下求出n的最⼤值;q求出sum和n的值。

通信工程专业微机原理与应用上机考试题目及答案代码

通信工程专业微机原理与应用上机考试题目及答案代码

1、(80分)(1)编程将D1、D2两个存储单元中的无符号字节数相加,结果放到D3存储单元(结果不超过255)。

(2)设8255A的A口接8个发光二极管,B口接8个开关,要求编一程序使8个开关控制对应的发光二极管的亮和灭。

已知8255A的端口地址从300H-303H。

2、(80分)(1)编程将D1、D2两个存储单元中的无符号字节数相减,结果放到D3存储单元(结果不超过255)。

(2)设8255A的B口接8个发光二极管,A口接8个开关,要求编一程序使8个开关控制对应的发光二极管的亮和灭。

已知8255A的端口地址从300H-303H。

3、(80分)(1)假设0~9的平方值存放在DATA1开始的内存中,取出“3”所对应的平方值。

(2)设8255A的C口的8根数据线接8个发光二极管,A口的8根数据线接8个开关,要求编一简单程序使8个开关控制对应的发光二极管的亮和灭。

已知8255A的端口地址从300H-303H。

4、(80分)(1)设8255A的C口的8根数据线接8个发光二极管,A口的8根数据线接8个开关,要求编一简单程序使8个开关控制对应的发光二极管的亮和灭。

已知8255A的端口地址从300H-303H。

(2)X、Y、Z都为字节定义的数据,将X+Y+Z将结果放在SUM单元中(结果不超过255)。

5、(80分)(1)设8255A的B口接8个发光二极管,C口接8个开关,要求编一程序使8个开关控制对应的发光二极管的亮和灭。

已知8255A的端口地址从300H-303H。

(2)X、Y、Z都为字节定义的数据,将X+Y-Z将结果放在SUM单元中(结果不超过255)。

6、(80分)(1)8253的计数器2工作在方式0,设计数初值为4,输出OUT2接发光二极管,CLK2接手动脉冲信号,请问,按几下手动脉冲发生器使发光二极管熄灭?电路连接如下图所示。

(2)编程将缓冲区buf1中的8个字数据传送到buf2开始的缓冲区中。

7、(80分)(1)8253的计数器1工作在方式3,设计数初值为4,输出OUT1接发光二极管,CLK1接手动脉冲信号,按几下手动脉冲发生器,可改变发光二极管的状态?电路连接如下图所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.用74LS273设计1个七段显示器的接口。

在该七段显示器上循环显示:0、1、2、3(3FH,06H,5BH,4FH)。

2.用74LS244设计一个输入接口。

从输入端口读入开关状态(高表示‘1’,低表示‘0’),以十进制形式在CRT显示器上显示输入结果(0~255)。

如:输入开关状态:高高高高低低低低→
CRT显示:240
3.用DAC0832设计一个D/A接口(单缓冲方式) 产生三角波, 端口地址仅为B883H。

4.用8255设计一个输入/输出接口,C口输入开关表示的原码数,转换为补码后从B口输出到发光二极管上显示(高和亮表示‘1’,低和灭表示‘0’)。

如:输入开关状态:低高高低低高低高→
发光二极管: 灭亮亮灭灭亮灭亮
输入开关状态:高低低低低高低高→
发光二极管: 亮亮亮亮亮灭亮亮
5.用8255设计一个七段显示器接口,C端口输出,端口地址仅为B810H~B813,在该七段显示器上循环显示
6、7、8、9(7DH,07H,7FH,6FH).
6.用AD0809设计一个A/D接口,从IN4输入直流电压值0~5V,在CRT显示器上以00~FFH 的形式显示采样结果。

如:输入5V→CRT显示:FFH( 允许有误差)
如:输入0V →CRT显示:00H
7.用74LS273设计1个七段显示器的接口。

在该七段显示器上循环显示:4、5、6、7(66H,6DH,7DH,07H)。

8.用DAC0832设计一个D/A接口(单缓冲方式) 产生锯齿波, 端口地址仅为B803H。

9.用74LS273设计1个七段显示器的接口。

从键盘输入1个字符(A-D),在七段显示器上闪亮显示该字符。

设显示字型为:A、b、C、d(77H,7CH,39H,5EH)。

10.用AD0809设计一个A/D接口,从IN1输入直流电压值0~5V,在CRT显示器上以十进制形式显示采样结果。

如:输入5V→CRT显示:255( 允许有误差)
如:输入0V →CRT显示:0。

相关文档
最新文档