微机原理实验代码
民航大学微机原理实验报告及试验程序
微机原理与接口技术实验报告实验环境: Windows XP SP3实验软件:masm, link, debug, edit。
Test 1: debug命令及汇编指令和寻址的应用。
NO.1设堆栈指针SP=2000H, AX=3000H, BX=5000H;请编一程序段将AX和BX的内容进行交换。
要求:用3种方法实现。
方法一CODE SEGMENT ASSUME CS:CODE START: MOV AX,3000HMOV BX,5000H MOV CX,AX MOV AX,BX MOV BX,CX CODE ENDS END START 方法二CODE SEGMENTASSUME CS:CODESTART: MOVAX,3000HMOV BX,5000HXCHG AX,BXCODE ENDSEND START方法三CODE SEGMENTASSUME CS:CODESTART: MOVAX,3000HMOV BX,5000HPUSH AXPUSH BXPOP AXPOP BXCODE ENDSEND STARTNO.2分别执行以下指令, 比较寄存器寻址,寄存器间接寻址和相对寄存器寻址间的区别。
MOV AX,BX 寄存器寻址, 将BX内容送AXMOV AX,[BX] 寄存器间接寻址, 将DS:BX内存单元内容送AXMOV AX,10[BX] 寄存器相对寻址, 将DS:BX+10内存单元内容送AXNO.3已知有如下程序段:MOV AX, 1234HMOV CL, 4在以上程序段的基础上, 分别执行以下指令:ROL AX, CL AX=4123HROR AX, CL AX=3412HSHL AX, CL AX=4120HSHR AX, CL AX=0412HSAR AX, CL AX=0041HRCL AX, CL AX=0410HRCR AX, CL AX=0041HNO.4设有以下部分程序段:TABLE DW 10H,20H,30H,40H,50HENTRY DW 3┇LEA BX,TABLEADD BX,ENTRYMOV AX,[BX]┇要求: (1)将以上程序段补充成为一个完整的汇编程序。
微机原理实验
1.输入课本相关程序并加以注释;DATAS SEGMENTVARX DW 20HVARY DW 13HVARZ DW ?;此处输入数据段代码DATAS ENDSSTACKS SEGMENTDW 20H DUP(?);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,VARXMOV CL,3SHL AX,CLADD AX,VARYSUB AX,7MOV CL,2SAR AX,CLMOV VARZ,AX;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START2.编写一程序,在屏幕上当前光标处显示字符串“Hello world!”。
DATAS SEGMENTSTRING DB 'HELLO WORLD!$';此处输入数据段代码DATAS ENDSSTACKS SEGMENTDB 20H DUP(?);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXLEA DX,STRINGMOV AH,09HINT 21H;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START1.编制程序实现Z=(16X+Y-9)/4 ,并在屏幕上显示计算结果。
DATAS SEGMENTVARX DW 20HVARY DW 13HVARZ DW ?;此处输入数据段代码DATAS ENDSSTACKS SEGMENTDW 20H DUP(?);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,VARXMOV CL,4SHL AX,CLADD AX,VARYSUB AX,9MOV CL,2SAR AX,CLMOV VARZ,AX;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START2.从键盘输入一个小写字符,将其转换为大写在屏幕显示。
微机原理代码
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) ; 要显示数字缓冲区
西安交通大学微机原理上机实验一代码
1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH,97H,64H,BBH,7FH,0FH,D8H。
编程并显示结果:(1)如果数组是无符号数,求出最大值,并显示;(2)如果数组是有符号数,求出最大值,并显示。
(1)#make_COM#ORG 100HJMP STARTD1 DB 93H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H ;建立一个9字节的数组START:MOV AL,80H ;给AL附初值MOV SI,0 ;给SI附初值MOV CX,9 ;比较次数AGAIN:CMP AL,D1[SI] ;比较过程JNA EXC ;低于/等于则跳转INC SILOOP AGAINJMP EXITEXC: MOV AL,D1[SI] ;覆盖原内容INC SILOOP AGAINJMP EXITEXIT: MOV BL,AL ;显示结果高4位AND AL,0F0HSHR AL,4CMP AL,0AHJB XADD AL,7HX: ADD AL,30HMOV DL,ALMOV AH,02HINT 21HMOV AL,BL ;显示结果低4位AND AL,0FHCMP AL,0AHJB XXADD AL,7HXX: ADD AL,30HMOV DL,ALINT 21HMOV AL,'H'MOV DL,ALMOV AH,02HINT 21HRETEND START(2)#make_COM#ORG 100HJMP STARTD1 DB 93H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H ;建立一个9字节的数组START:MOV AL,80H ;给AL附初值MOV SI,0 ;给SI附初值MOV CX,9 ;比较次数AGAIN:CMP AL,D1[SI] ;比较过程JNG EXC ;低于/等于则跳转INC SILOOP AGAINJMP EXITEXC: MOV AL,D1[SI] ;覆盖原内容INC SILOOP AGAINJMP EXITEXIT: MOV BL,AL ;显示结果高4位AND AL,0F0HSHR AL,4CMP AL,0AHJB XADD AL,7HX: ADD AL,30HMOV DL,ALMOV AH,02HINT 21HMOV AL,BL ;显示结果低4位AND AL,0FHJB XXADD AL,7HXX: ADD AL,30HMOV DL,ALMOV AH,02HINT 21HMOV AL,'H'MOV DL,ALMOV AH,02HINT 21HRETEND START2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H的BCD是:”#make_COM#ORG 100HJMP STARTSTRING DB 'THE BCD OF 500H IS:$' ;提示语ARRAY DB 4 DUP(?) ;BCD码缓存区START: LEA DX,STRING ;显示提示语MOV AH,9INT 21HMOV AX,500HMOV BX,0 ;BX指向ARRAY申请的空间MOV DL,0AGAIN1: S UB AX,03E8H ;(AX)-1000JC NEXT1 ;不够减,即CF=1转INC DL ;(DL)+1JMP AGAIN1NEXT1: ADD AX,03E8H ;(AX)←(AX)+1000MOV ARRAY[BX],DL ;存DL;INC BX ;BX 加1MOV DL,0 ;令(DL)=0AGAIN2: S UB AX,0064H ;(AX)-100JC NEXT2INC DLJMP AGAIN2NEXT2: ADD AX,0064HMOV ARRAY[BX],DLINC BXMOV DL,0AGAIN3: S UB AX,000AH ;(AX)-10JC NEXT3INC DLJMP AGAIN3NEXT3: ADD AX,000AHMOV ARRAY[BX],DLINC BXMOV ARRAY[BX],ALMOV DX,0 ;循环显示结果MOV CX,4MOV SI,0OUTPUT: MOV DL,ARRAY[SI]ADD DL,30HMOV AH,2INT 21HINC SILOOP OUTPUTMOV AH, 4CH ;返回DOS系统INT 21HEND START3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD码7693的ASCII 是:”#make_COM#ORG 100HJMP STARTD1 DB 'THE ASCII OF BCD 7693 IS:$'D2 DB 07H,06H,09H,03HSTART: LEA DX,D1 ;显示提示语MOV AH,9INT 21HMOV CX,4LEA SI,D2AGAIN:MOV AL,[SI]OR AL,30HMOV BL,AL ;显示低位ASCII码SHR AL,4AND AL,0FHADD AL,30HMOV DL,ALMOV AH,2INT 21HMOV AL,BL ;显示高位ASCII码AND AL,0FHADD AL,30HMOV DL,ALMOV AH,2INT 21HINC SIMOV DL,'H'MOV AH,2INT 21HLOOP AGAINRETEND START4、两个长度均为100的内存块,先将内存块1全部写上88H,再将内存块1的内容移至内存块2。
微机原理实验
微机原理实验实验⼀8086指令使⽤实验⽬的通过实验掌握下列知识:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG2、DEBUG命令: A,D,E,F,H,R,T,U。
3、BCD码,ASCII码及⽤⼗六进制数表⽰⼆进制码的⽅法。
4、8086寄存器: AX,BX,CX,DX,F,IP。
内容及步骤⼀、DEBUG 命令使⽤1、键⼊ DEBUG 进⼊ DEBUG 控制状态,显⽰提⽰符 '- '。
2、⽤命令 F100 10F 'A' 将'A'的ASCII码填⼊内存。
3、⽤命令 D100 10F 观察内存中的⼗六进制码及屏幕右边的ASCII字符。
4、⽤命令 F110 11F 41 重复上⼆项实验,观察结果并⽐较。
5、⽤命令 E100 30 31 32 …… 3F将30H-3FH写⼊地址为100开始的内存单元中,再⽤D命令观察结果,看键⼊的⼗六进制数是什么字符的ASCII码?6、⽤H命令检查下列各组⼗六进制数加减结果并和你的⼿算结果⽐较:(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758H,347FH7、⽤R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
8、⽤R命令将AX,BX内容改写为1050H及23A8H。
⼆、8086常⽤指令练习1、传送指令1)⽤A命令在内存100H处键⼊下列内容:-A 0100↙****:0100 MOV AX,1234↙****:0103 MOV BX,5678↙****:0106 XCHG AX,BX↙****:0108 MOV AH,35↙****:010A MOV AL,48↙****:010D MOV DX,75AB↙****:010F XCHG AX,DX↙****:0111 ↙-注:****为段寄存器CS的值,是由计算机⽣成的;↙为回车操作。
微机原理实验
一.实验目的:掌握综合性实验的编写方法二.实验内容:编写程序实现以下功能,在出现的提示信息中输入小写写字母“d”,可显示系统当前日期;输入小写写字母“t”,可显示系统当前时间;输入大写字母“q”,可结束程序。
三、源代码:STACK SEGMENT STACKDW 200 DUP (?)STACK ENDSDATA SEGMENTSPACE DB 1000 DUP (' ')PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ')DBUFFER DB 8 DUP (':'),12 DUP (' ')DBUFFER1 DB 20 DUP (' ')STR DB 0DH,0AH, 'please input date(d) OR time(t) OR quit(q): $' DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,0001H ;设置显示方式为40*25彩色文本方式INT 10HMOV AX,DATAMOV DS,AXMOV ES,AXMOV BP,OFFSET SPACEMOV DX,0B00HMOV CX,1000MOV BX,0007HMOV AX,1300HINT 10HMOV BP,OFFSET PATTERN ;显示矩形条MOV DX,0B00HMOV CX,120MOV BX,004EHMOV AX,1301HINT 10HLEA DX,STR ;显示提示信息MOV AH,9INT 21HMOV AH,1 ;从键盘输入单个字符 INT 21HCMP AL,64H ;AL='d'?JNE ACALL DATE ;显示系统日期A: CMP AL,74H ;AL='t'?JNE BCALL TIME ;显示系统时间B: CMP AL,71H ;AL='q'?JNE STARTMOV AH,4CH ;返回dos状态INT 21HDATE PROC NEAR ;显示日期子程序DISPLAY:MOV AH,2AH ;取日期INT 21HMOV SI,0MOV BX,100DIV BLMOV BL,AHCALL BCDASC1 ;日期数值转换成相应的ASCII码字符 MOV AL,BLCALL BCDASC1INC SIMOV AL,DHCALL BCDASC1INC SIMOV AL,DLCALL BCDASC1MOV BP,OFFSET DBUFFER1MOV DX,0C0DHMOV CX,20MOV BX,004EHMOV AX,1301HINT 10HMOV AH,02H ;设置光标位置MOV DX,0300HMOV BH,0INT 10HMOV BX,0018HREPEA: MOV CX,0FFFFH ;延时REPEAT:LOOP REPEATDEC BXJNZ REPEAMOV AH,01H ;读键盘缓冲区字符到AL寄存器JE DISPLAYJMP STARTMOV AX,4C00HINT 21HRETDATE ENDPTIME PROC NEAR ;显示时间子程序DISPLAY1:MOV SI,0MOV BX,100DIV BLMOV AH,2CH ;取时间INT 21HMOV AL,CHCALL BCDASC ;将时间数值转换成ASCII码字符 INC SIMOV AL,CLCALL BCDASCINC SIMOV AL,DHCALL BCDASCMOV BP,OFFSET DBUFFERMOV DX,0C0DHMOV CX,20MOV BX,004EHMOV AX,1301HINT 10HMOV AH,02HMOV DX,0300HINT 10HMOV BX,0018HRE: MOV CX,0FFFFHREA: LOOP READEC BXJNZ REMOV AH,01HINT 16HJE DISPLAY1JMP STARTMOV AX,4C00HINT 21HRETTIME ENDPBCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序 PUSH BXCBWMOV BL,10DIV BLADD AL,'0'MOV DBUFFER[SI],ALINC SIADD AH,'0'MOV DBUFFER[SI],AHINC SIPOP BXRETBCDASC ENDPBCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序 PUSH BXCBWMOV BL,10DIV BLADD AL,'0'MOV DBUFFER1[SI],ALINC SIADD AH,'0'MOV DBUFFER1[SI],AHINC SIPOP BXRETBCDASC1 ENDPCODE ENDSEND START四、实验过程:1.进入asm文件2.编译链接生成exe文件3.-u-g4c-t。
西南交大微机原理实验代码与截图(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、掌握用编辑软件编辑程序文本的方法。
在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,存盘操作。
微机原理实验(含解答程序)
微机原理实验程序(汇编程序可以使用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 排序程序设计六.参考代码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。
微机原理实验
微机原理实验(一)十六进制与十进制的转换一、实验要求从键盘上输入一个十六进制数,将其转换成十进制数并在显示器上显示出来。
二、设计思路最简单的实现是将十六进制数中0~9和a~f分开处理,缺点是只能处理单十六进制数。
另一种是一个相对繁琐但是可以处理任意四位的十六进制数,主要是移位操作来实现。
三、源代码CODE SEGMENTUME CS: CODESTART: MOV AH, 01HINT 21HMOV BL, ALCMP BL, 40HJG NEXTCONT: MOV AH, 02HMOV DL, BLINT 21HMOV DL, 20HINT 21HJMP STARTMOV AH, 4CHINT 21HNEXT: SUB BL, 11HMOV AH, 02HMOV DL, '1'INT 21HJMP CONTCODE ENDSEND START微机原理实验(二)键盘输入一、实验要求:从键盘上输入一串字符,当输入字符是回车时,显示出输入的所有字符。
二、设计思路利用dos提供的中断处理语句进行屏显,该程序比较易于实现。
三、源程序STACK SEGMENT STACKDB 100 DUP(66H)STACK ENDSDATA SEGMENTbuff db 200 dup(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,0MOV BL,0DHMOV CX,0MOV AH,01GOON1:INT 21HMOV [SI],ALINC CXINC SICMP AL,BLJNE GOON1MOV AH,02MOV DL,0DHINT 21HMOV DL,0AHINT 21HSUB SI,CXDEC CXGOON2:MOV DL,[SI]INT 21HINC SIDEC CXJNZ GOON2MOV AH,4CHINT 21HCODE ENDSEND START微机原理实验(三)简单I/O端口应用实验一、实验目的掌握基本并行接口的工作原理及使用方法。
微机原理实验代码打印
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)输入一个十进制的个位数,求出这个数的平方值,显示其十进制结果,要求有如下提示信息。
微机原理实验参考程序
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循环点亮。
(完整word版)微机原理完整实验报告+程序
实验题目8253定时/计数器实验 一、 实验目的与要求: 1. 学会8253芯片和微机接口原理和方法。
2. 掌握8253定时器/计数器的工作方式和编程原理。
二、 实验内容: 1、实验原理 本实验原理图如图 1所示,8253A 的A0、A1接系统地址总线 A0、A1,故8253A 本实验通道2 有四个端口地址,如端口地址表 1所示。
8253A 的片选地址为 48H~ 4FH 。
因此, 仪中的8253A 四个端口地址为 48H 、49H 、4AH 、4BH ,分别对应通道 0、通道1、 和控制字。
采用8253A 通道0,工作在方式3(方波发生器方式),输入时钟CLK0为 输出OUTO 要求为1KHZ 的方波,并要求用接在 GATE0引脚上的导线是接地("0" 甩空("1"电平)来观察GATE 对计数器的控制作用,用示波器观察输出波形。
2、实验线路连接 (1) 8253A 芯片的CLK0引出插孔连分频输出插孔 (2) 8253A 的 GATE0 接+5V 。
实验步骤 (1) 按图1连好实验线路(2) 运行实验程序 1. 按“调试”按钮2. 选“窗口” “进入示波器窗口” ,然后最小化3. 按“运行按钮”4.将模拟示波器窗口打开,选择“串行口 2”,再按 Ctrl + F2按钮即可看到波形 显示“ 8253-1 ”用示波器测量8253A 的OUT2输出插孔,方波输出,幅值0〜4V 三、实验代码: 1MHZ ,电平)或 3、 CODE SEGMENT ASSUME CS:CODE TCONTRO EQU 004BH TCON2 EQU 004AH CONT PORT EQU 00DFH DATA PORT EQU 00DEH DATA1 EQU 0500H START: JMP TCONT TCONT: CALL FORMATCALL LEDDIS P MOV DX,TCONTRO1MHZ 。
北邮微机原理硬件实验报告及代码
北京邮电大学微机原理硬件实验报告实验1:熟悉实验环境及IO的使用实验2:8255A并行接口应用实验3:8253计数器/定时器的应用目录实验一熟悉实验环境及IO的使用 (2)一、实验目的 (2)二、实验内容及要求 (2)三、实验结果 (2)1、程序说明 (2)2、流程图 (4)3、源代码 (6)四、实验总结 (9)实验二8255A并行接口应用 (9)一、实验目的 (9)二、实验任务及内容 (9)1、6 位数码管静态显示 (10)2、6 位数码管动态显示 (10)3、扩展部分 (10)三、实验结果1(6位数码管静态显示) (10)1、程序说明 (10)2、流程图 (11)3、源代码 (11)四、实验结果2(6位数码管动态显示) (13)1、程序说明 (13)2、流程图 (14)3、源代码 (15)五、实验结果(扩展部分) (17)1、程序说明 (17)2、流程图 (18)3、源代码 (18)六、实验总结 (22)实验三8253计数器/定时器的应用 (22)一、实验目的 (22)二、实验任务及内容 (22)1.音乐发生器 (22)2.扩展部分 (23)三、实验结果1(音乐发生器) (23)1、程序说明 (23)2、流程图 (23)3、源代码 (24)四、实验结果2(扩展部分) (29)1、程序说明 (29)2、流程图 (29)3、源代码 (30)五、实验总结 (34)实验一熟悉实验环境及IO的使用一、实验目的1 .通过实验了解和熟悉实验台的结构,功能及使用方法。
2 .通过实验掌握直接使用Debug 的I、O 命令来读写IO端口。
3 .学会Debug 的使用及编写汇编程序二、实验内容及要求1 .学习使用Debug 命令,并用I、O 命令直接对端口进行读写操作,2 .用汇编语言编写跑马灯程序。
(使用EDIT编辑工具)实现功能A.通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。
B.通过输出端口控制灯的工作状态(低电平灯亮三、实验结果1、程序说明跑马灯程序共实现:16种灯型、4种速度、暂停、退出等功能。
微机原理实验代码
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。
微机原理实验程序
STACK1 SEGMENT STACK
DW 64 DUP(?)
STACK1 ENDS
DATA SEGMENT
XL DW ? ;请在此处给X低位赋值
;* Aexp3.asm(运算类指令编程实验) *
;* Copyright (c) 2002 by HUST *
;* 程序调试:在MOV AH,4CH处设置断点,利用Add Watch命令查看ZH中的内容是否正确 *
START:
MOV AX,DATA
MOV DS,AX
MOV AX,XL ;X的低位送AX
ADD AX,YL ;X的低位加Y的低位
MOV ZL,AX ;存低位和
MOV AX,XH ;X的高位送AX
;* Aexp4.asm(分支程序设计实验) *
;* Copyright (c) 2002 by HUST *
;* 程序调试:在EXIT:MOV AH,4CH处设置断点,利用Add Watch *
L1: CMP Y,0
JGE L2 ;y>=0转L2
MOV A,-1 ;x<0,y<0时,-1送A
JMP EXIT
L2: MOV A,0 ;x与y异号时,0送A
EXIT: MOV AH,4CH
INT 21H
exit: MOV AH,4CH
INT 21H
end0: mov byte ptr [si],'$'
inc cx
mov bp,cx
微机原理实验代码
实验一分析并对比以下各程序段运行的结果。
1.两种加法指令比较(1) STCMOV AL,50HMOV BL,60HADD AL,BL(2)STCMOV AL,50HMOV BL,60HADC AL,BL2.两种加1指令比较(1) MOV AL,0FFHINC AL(2) MOV AL,0FFHADD AL,13.两种乘法指令比较(1) MOV AL,0FFHMOV BL,0FFHMUL BL(2) MOV AL,0FFHMOV BL,0FFHIMUL BL4.逻辑指令比较(1) MOV AL,55HAND AL,0FH(2) MOV AL,55HOR AL,0FH(3) MOV AL,55HXOR AL,0FH(4) MOV AL,55HTEST AL,0FH5.移位指令比较(1) MOV AL,55HSHL AL,1(2) MOV AL,55HSHR AL, 1(3) MOV AL,55HSAR AL, 1(4) STCMOV AL,55HROL AL, 1(5) STCMOV AL,55HROR AL, 1(6) STCMOV AL,55HRCL AL, 1(7) STCMOV AL,55HRCR AL, 1在数据段中定义变量X、Y、Z、RESULT,计算X+Y-Z,结果存入数据段中的单元中。
其中X、Y、Z均为32位带符号数。
DATAS SEGMENT ;数据段;请在这里定义您的数据X DD 33331111HY DD 44442222HZ DD 55557777HRESULT DD ?DATAS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS ;初始化MOV DS,AX;请在这里添加您的代码MOV AX,WORD PTR X[0]MOV BX,WORD PTR X[2]MOV CX,WORD PTR Y[0]MOV DX,WORD PTR Y[2]ADD AX,CXADC BX,DXMOV CX,WORD PTR Z[0]MOV DX,WORD PTR Z[2]SUB AX,CXSBB BX,DXMOV WORD PTR RESULT[0],AXMOV WORD PTR RESULT[2],BX;MOV ;退出程序INT 21HCODES ENDSEND START实验二1.编写程序完成下列算式:DATAS SEGMENT ;数据段;请在这里定义您的数据X DB 10Y DB ?DATAS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS ;初始化MOV DS,AX;请在这里添加您的代码CMP X,0JL NEXT1JZ NEXT2MOV Y ,10JMP COMNEXT1:MOV Y ,-10JMP COMNEXT2:MOV Y ,0COM:CODES ENDSEND START2.在数据段定义无符号变量X 、Y 和MAX ,编程将X 和Y 中的最大数存入MAX 单元中。
微机原理编程实验
DATAREA SEGMENTSA VE_CNT DW ?ST ART_ADDR DW ?ARRAY_HEAD DW 8,45,32,18,78,96,67,21,85 DARAREA ENDSPROGNAM SEGMENTMAIN PROC FARASSUME CS:PROGNAM , DS:DAT AREA ST ART PUSH DSPUSH CXPUSH AXPUSH BXMOV AX , DAT AREAMOV DS , AXMOV ST ART_ADDR , DIMOV CX , ES:[ DI ]MOV SA VE_CNT , CXINIT:MOV BX , 1DEC SA VE_CNTJZ SORTEDMOV CX , SA VE_CNTMOV DI , ST ART_ADDRNEXT:ADD DI , 2MOV AX , ES:[ DI ]CMP ES:[ DI+2 ] , AXJAE CONTXCHG ES:[DI+2] , AXMOV ES:[DI] , AXSUB BX , BXCONT:LOOP NEXTCMP BX , 0JE INITSORTED:MOV DI , ST ART_ADDRPOP BXPOP AXPOP CXPOP DSRETMAIN ENDPPROGNAM ENDSENDCRLF MACRO ;宏定义MOV AH,02H ;AH=02HMOV DL,0DH ;DL=0DHINT 21H ;系统功能调用,输出回车字符MOV AH,02H ;AH=02HMOV DL,0AH ; DL=0AINT 21H ;系统功能调用,输出换行符ENDM ;宏定义结束DATA SEGMENT ;定义数据段MESS1 DB 'MATCH',0DH,0AH,'$' ;定义8个数据储存单元MESS2 DB 'NO MATCH',0DH,0AH,'$';定义11个数据储存单元MESS3 DB 'INPUT STRING1:',0DH,0AH,'$';定义17个数据储存单元MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' ;定义17个数据储存单元MAXLEN1 DB 81 ;定义最大长度为81个字节ACTLEN1 DB ?STRING1 DB 81 DUP (?) ;定义STRING1长度为81 MAXLEN2 DB 81 ;定义最大长度为81ACTLEN2 DB ?STRING2 DB 81 DUP (?) ;定义STRING2长度为81 DATA ENDS ;数据段结束STACK SEGMENT STACK ;定义堆栈段STA DB 50 DUP (?) ;定义50个数据储存单元TOP EQU LENGTH STA ;给TOP赋值50STACK ENDS ;堆栈段结束CODE SEGMENT ;定义代码段ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ;定义段基址START: MOV AX,DATAMOV DS,AX ;把DATA的首地址赋给DS MOV ES,AX ;把DATA的首地址赋给ES MOV AX,STACKMOV SS,AX ;把STACK的首地址赋给SS MOV SP,TOP ;给SP赋值50MOV AH,09H ;AH=09HMOV DX,OFFSET MESS3 ;把MESS3的偏移地址赋给DX INT 21H ;系统功能调用MOV AH,0AH ;AH=0AHMOV DX,OFFSET MAXLEN1 ;把MAXLEN1的偏移地址赋给DX INT 21H ;系统功能调用CRLFMOV AH,09H ;AH=09HMOV DX,OFFSET MESS4 ;把MESS4的偏移地址赋给DX INT 21H ;系统功能调用MOV AH,0AH ;AH=0AHMOV DX,OFFSET MAXLEN2 ;把MAXLEN2的偏移地址赋给DX INT 21H ;系统功能调用CRLFCLDMOV SI,OFFSET STRING1 ;把STRING1的偏移地址赋给SI MOV CL,[SI-1] ;把SI-1内的内容赋给CL MOV CH,00H ;CH=00HKKK: MOV DI,OFFSET STRING2 ;把STRING2的偏移地址赋给DI PUSH CX ;将CX压入堆栈MOV CL,[DI-1] ;将DI-1内的的内容赋给CL MOV CH,00H ;CH=00HMOV AL,[SI] ;将SI内的内容赋给AL MOV DX,DI ;将DI赋给DXREPNZ SCASB ;寻找第一个相同字符JZ GGG ;ZF=0执行GGG否则顺序执行INC SI ;SI自加1POP CX ;弹出CXLOOP KKK ;跳转到KKK循环MOV AH,09HMOV DX,OFFSET MESS2INT 21H ;系统功能调用JMP PPP ;跳转到PPPGGG: MOV AH,09HMOV DX,OFFSET MESS1INT 21H ;输出MESS1PPP: MOV AX,4C00HINT 21H ;带返回码结束CODE ENDS ;代码段结束END START ;整个程序结束2DA TA SEGMENTp1 db 100P2 db 0array db 100 dup(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART: MOV AX,DA TAMOV DS,AXmov dx,offset p1MOV AH,0AHINT 21Hxor bx,bxmov BL,p2mov array[bx],'$'mov di,0ffffh next: inc dicmp array[di],'$'je exitcmp array[di],61hjl nextcmp array[di],7ahjg nextsub array[di],20hjmp nextexit: mov p1, 0dhmov p2, 0ahMOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在数据段中定义变量X 、Y 、Z 、RESULT ,计算X+Y-Z,结果存入数据段中的单元中。
其中X 、Y 、Z 均为32位带符号数。
DATAS SEGMENT ;数据段
;请在这里定义您的数据
X DD 33331111H
Y DD 44442222H
Z DD 55557777H
RESULT DD ?
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
MOV AX,WORD PTR X[0]
MOV BX,WORD PTR X[2]
MOV CX,WORD PTR Y[0]
MOV DX,WORD PTR Y[2]
ADD AX,CX
ADC BX,DX
MOV CX,WORD PTR Z[0]
MOV DX,WORD PTR Z[2]
SUB AX,CX
SBB BX,DX
MOV WORD PTR RESULT[0],AX
MOV WORD PTR RESULT[2],BX
;MOV ;退出程序
INT 21H
CODES ENDS
END START
1.编写程序完成下列算式:
DATAS SEGMENT ;数据段
;请在这里定义您的数据
X DB 10
Y DB ?
DATAS ENDS
CODES SEGMENT ;代码段 Y=
10 X>0
0 X=0 -10 X<0
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
CMP X,0
JL NEXT1
JZ NEXT2
MOV Y,10
JMP COM
NEXT1:
MOV Y,-10
JMP COM
NEXT2:
MOV Y,0
COM:
CODES ENDS
END START
2.在数据段定义无符号变量X、Y和MAX,编程将X和Y中的最大数存入MAX DATAS SEGMENT ;数据段
;请在这里定义您的数据
X DB 30
Y DB 20
MAX DB ?
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
MOV AL,X
CMP AL,Y
JB NEXT1
JZ NEXT2
MOV BL,X
MOV MAX,BL
JMP COM
NEXT1: MOV CL,Y
MOV MAX,CL
JMP COM
NEXT2: MOV DL,X
MOV MAX,DL
COM:
CODES ENDS
END START
假设一个变量中存储的是一个带符号数的原码,编程求其补码。
DATAS SEGMENT ;数据段
;请在这里定义您的数据
X DB 10001010B
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
CMP X,0
JL NEXT1
JMP COM
NEXT1: NOT X
OR X,80H
ADD X,1
COM:
CODES ENDS
END START
1.统计BX寄存器中二进制1的个数。
DATAS SEGMENT ;数据段
;请在这里定义您的数据
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
MOV BX,1111101010110101B
MOV CX,16
MOV AL,0
AGAIN: ROR BX,1
JNC LP
ADD AL,1
LP: LOOP AGAIN
MOV AX,4C00H ;退出程序
INT 21H
CODES ENDS
END START
2.定义10个字型带符号数,求其最大值并存于max单元中。
DATAS SEGMENT ;数据段
;请在这里定义您的数据
BUFDW
1B32H,4F07H,2137H,25F9H,25E6H,98F5H,87FFH,25DCH,2735H,15ABH MAX DW ?
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
LEA SI,BUF
MOV CX,10
MOV AX,[SI]
INC SI
INC SI
DEC CX
AGAIN: CMP AX,[SI]
JGE NEXT
MOV AX,[SI]
NEXT: INC SI
INC SI
LOOP AGAIN
MOV MAX,AX
1.将BX中的十六进制数转换成4个ASCII码数据代码转换部分用子程序实现。
DATAS SEGMENT ;数据段
;请在这里定义您的数据
RESULT DB 4 DUP(?)
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
LEA SI,RESULT
MOV CX,0404H
MOV BX,0F7DCH
AGAIN: ROL BX,CL
MOV AL,BL
AND AL,0FH
CALL ASC
INC SI
DEC CH
JNZ AGAIN
ASC PROC
ADD AL,30H
CMP AL,39H
JBE COM
ADD AL,7H
COM: RET
ASC ENDP
MOV AX,4C00H ;退出程序
INT 21H
CODES ENDS
END START
2.从键盘接收4位十进制数,将其转换为十六进制数并显示。
注:转换结果存放在BX中。
CODE SEGMENT
ASSUME CS:CODE
START:
MOV CX,4
NEWCHAR: MOV AH, 1 ;键盘输入
INT 21H
SUB AL, 30H
JL NEWCHAR ; <0重输
CMP AL, 9
JG NEWCHAR ; >9重输
CBW
XCHG AX, BX
MOV DX, 10
MUL DX
XCHG AX, BX
ADD BX, AX
LOOP NEWCHAR
EXIT:
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV CH, 4
ROTATE: MOV CL, 4
MOV AL, BL
AND AL, 0FH
ADD AL, 30H ; ’0’~’9’ASCII 30H~39H
CMP AL, 3AH
JL PRINTIT
ADD AL, 7H ; ’A’~’F’ASCII 41H~46H PRINTIT: MOV DL, AL
MOV AH, 2
INT 21H
DEC CH
JNZ ROTATE
MOV AH,1
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
1.从键盘接收一个字符,然后显示其对应的前导、本身和后继字符。
CODES SEGMENT ;代码段
ASSUME CS:CODES
START:
;请在这里添加您的代码
MOV AH,1
INT 21H
MOV CX,3
DEC AL
LP: MOV AH,2
MOV DL,AL
INT 21H
INC AL
LOOP LP
MOV AX,4C00H ;退出程序
INT 21H
CODES ENDS
END START
2.在屏幕上显示26个大写英文字母A~Z。
CODES SEGMENT ;代码段
ASSUME CS:CODES
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
MOV AL,41H
MOV CX,26
LP: MOV AH,2
MOV DL,AL
INT 21H
INC AL
LOOP LP
MOV AX,4C00H ;退出程序
INT 21H
CODES ENDS
END START。