\实验一内存操作1.实验目的①掌握数据传送指令;②掌握各种数据传送指令的寻址方式;③熟练运用keil环境对汇编程序进行调试;④掌握数据传送、复制等程序的设计与调试方法。2.预习要求①理解数据传送指令和循环指令的使用;②理解如何对内部寄存器、内部RAM、外部XRAM(外部数据存储器)的读写;③理解各种寻址方式,尤其是较为抽象的变址寻址及相对寻址的方式;④认真预习本实验内容,自行编写程序,填写实验报告。3.实验设备计算机1台;4.基础型实验内容:1.下列程序的功能是给外部XRAM8000H~80FFH的256个单元的内容赋值,赋值的内容取决于程序中A的赋值。在Keil环境运行该程序,并观察寄存器及内存单元的变化。ORG0000HSTARTEQU8000H;MAIN:MOVDPTR,#START;;起始地址MOVR0,#0H;;设置256字节计数值MOVA,#1H;Loop:MOVX@DPTR,A;INCDPTR;;指向下一个地址DJNZR0,Loop;;计数值减1NOP;SJMP$;END寄存器A为1H,DPTR递增到8100H,奇偶校验位由于A的内容是1H,所以p也是1.2.下列程序将外部XRAM3000H起始的256个字节存储块移动到外部XRAM4000H起始的256个字节存储块,在Keil环境运行如下程序,观察寄存器及存储单元的变化。ORG0000HMOVDPTR,#3000HMOVA,#01HMOVR5,#0HLOOP:MOVX@DPTR,AINCDPTRDJNZR5,LOOPMOVR0,#30HMOVR1,#00HMOVR2,#40HMOVR3,#00HMOVR7,#0HLOOP1:MOVDPH,R0MOVDPL,R1MOVXA,@DPTRMOVDPH,R2MOVDPL,R3MOVX@DPTR,AINCR1INCR3DJNZR7,LOOP1SJMP$END实现了将3000H开始的256个单元的内容复制到以4000H开头的外部RAM存储单元中。R0的值为30H;R2的值变为40H;寄存器A中赋值为1H,对栈指针sp初始化为07H,其最大值亦为07H,DPTR中最后递增到40ffH,psw中只有奇偶校验位p是1H3在Keil环境运行如下程序,观察寄存器及内存单元的变化,将变化结果注释于右侧,并说明程序完成什么功能?将程序中MOVA,@R0改成MOVXA,@R0,将MOV@R1,A改成MOVX@R1,A,运行如下程序,观察寄存器及相应地址RAM、XRAM地址单元存储内容的变化。1.ORG0000H;程序从000H开始MOVR0,#30H;MOVR1,#50HMOVR2,#20HL1:MOVA,@R0MOV@R1,AINCR0INCR1DJNZR2,L1SJMP$ENDR0的值递增到50H,R1的值递增到70H,A中的值是4FH中的值,即FFH(程序运行前自己设定的)该程序将内部RAM30H开始的连续20H个存储单元中的内容复制到内部RAM50H开始的连续20H个存储单元中。其中30H到4FH中的值在程序运行前自定义。2.将程序中MOVA,@R0改成MOVXA,@R0,将MOV@R1,A改成MOVX@R1,AORG0000HMOVR0,#30HMOVR1,#50HMOVR2,#20HL1:MOVXA,@R0MOVX@R1,AINCR0INCR1DJNZR2,L1SJMP$END寄存器A中的数值没有发生过任何变化,R0和R1同未改变前一样,一直递增到50H和70H虽然设定了外部RAM30H到4FH中的值,但是并没有复制到50H到6FH存储单元中。原因是初始化后P口都为#FFH,而使用MOVXA,@Ri要求P2口为#00H,所以只要在程序前加MOVP2,#00H就能实现和原来一样的功能了5.设计型实验①在keil环境下,修改内部RAM30H~3FH的内容分别为#00H~#0FH,设计程序实现将内部RAM30H-3FH单元的内容复制到40H-4FH中。ORG000H;MOVR2,#10H;MOVA,#0H;MOVR1,#30H;MOVR0,#40H;LOOP:MOV@R1,A;INCR1;INCA;DJNZR2,LOOP;MOVR1,#30H;MOVR2,#10H;LOOP2:MOVA,@R1;MOV@R0,A;INCR1;INCR0;DJNZR2,LOOP2;SJMP$;END②在keil环境下,修改内部RAM30H~3FH的内容分别为#00H~#0FH,设计程序实现将内部RAM30H~3FH单元的内容复制到片外1030H~103FH中。ORG000H;MOVR2,#10H;MOVA,#0H;MOVR1,#30H;MOVDPTR,#1030H;LOOP:MOV@R1,A;INCR1;INCA;DJNZR2,LOOP;MOVR1,#30H;MOVR2,#10H;LOOP2:MOVA,@R1;MOVX@DPTR,A;INCR1;INCDPTR;DJNZR2,LOOP2;SJMP$;END③设计程序将外部64KB的XRAM高低地址存储内容互换;如0000H与0FFFFH,0001H与0FFFEH,0002H与0FFFDH,…….互换;互换数据个数为256。ORG000H;MOVDPTR,#0FFFFH;MOVR1,DPL;保存当然DPTR低位loop:MOVDPL,R1;MOVXA,@DPTR;MOVR3,A;保存当前DPTR的内容MOVR0,DPH;保存当然DPTR高位MOVA,DPH;CPLA;求得当前DPTR高位的反码MOVDPH,A;MOVA,R1;CPLA;求得当前DPTR低位的反码MOVDPL,A;求得当前DPTR反码MOVXA,@DPTR;MOVR4,A;保存当前DPTR对称码(反码)的内容MOVA,R3;MOVX@DPTR,A;将当前DPTR(原码)的内容存入对称码中MOVDPH,R0;MOVDPL,R1;还原DPTRMOVA,R4;MOVX@DPTR,A;将对称码的内容存入当前DPTR(原码)DECR1;CJNER1,#0FFH,LOOP;SJMP$;END运行前:运行后:6.综合型实验a)设计程序实现将外部XRAM0000H起始的512个字节数据传送到外部XRAM2000H起始的512个存储单元中。ORG0000H;MOVR3,#0H;MOVDPTR,#0000H;LOOP:MOVXA,@DPTR;MOVR0,DPL;MOVDPH,#20H;MOVX@DPTR,A;INCR0;MOVDPL,R0;MOVDPH,#0H;DJNZR3,LOOP;SJMP$;ENDX:0H至X:0FFH的值是自定义的;运行程序后复制到X:2000H至X:20FFH;b)若源块地址和目标块地址有重叠,程序该如何设计(用地址减1方法移动块)?假设源块地址2000H,目标块地址2050H,移动块长度80H;试设计程序实现该功能。思路:先将由源块地址起始的数据块保存到非目标块地址中(防止覆盖目标地址),然后再复制到目标块地址;ORG0000H;MOVDPTR,#2000H;MOVR3,#80H;LOOP:MOVXA,@DPTR;MOVR0,DPH;MOVR1,DPL;MOVDPH,#30H;MOVX@DPTR,A;MOVDPH,R0;INCR1;MOVDPL,R1;DJNZR3,LOOP;本循环实现将x:2000H开始的80个单元中的内容复制到x:3000H开始的80个单元中去MOVDPTR,#3000H;MOVR3,#80H;MOVR4,#50H;LOOP2:MOVXA,@DPTR;MOVR2,A;MOVR0,DPH;MOVR1,DPL;MOVA,R4;MOVDPH,#20H;MOVDPL,A;MOVA,R2;MOVX@DPTR,A;INCR4;MOVDPH,R0;INCR1;MOVDPL,R1;DJNZR3,LOOP2;本循环实现将x:3000H开始的80个单元中的内容复制到x:2050H开始的80个单元中去SJMP$;END实验二数制及代码转换1.实验目的①了解微机系统中的数制与代码表示方法;②掌握计算机中使用的各种代码转换方法;③掌握实现分支、循环的指令及其程序的编写方法;2.预习要求①理解十进制数、十六进制数的数制表示方法;②理解BCD码、ASCII码编码方式;③如何实现十六进制数与BCD码之间的转换;④如何实现ASCII码与BCD码之间的转换。3.实验设备计算机1台。4.基础型实验内容①以下程序完成单字节的ASCII码到十六进制数转换,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及相应地址内存单元内容的变化。RESULTEQU30HORG0000HMOVA,#41H;“A”的ASCII码CLRCSUBBA,#37H;转换为十六进制值AMOVRESULT,ALJMP$END②以下程序完成单字节的BCD码到十六进制数转换,,在Keil环境运行程序,观察寄存器及相应地址内存单元内容的变化。RESULTEQU30HORG0000HMOVA,#23HMOVR0,AANLA,#0F0HSWAPAMOVB,#0AHMULABMOVRESULT,A;转换高位MOVA,R0MOVB,#0FHANLA,B;ADDA,RESULTMOVRESULT,A;转换低位SJMP$END③以下程序将单字节十六进制数A的值转换为十进制数,存放在30H~32H中,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及相应地址内存单元内容的变化。RESULTEQU30HORG0000HMOVA,#7BHMOVB,#100DIVABMOVRESULT,A;除以100得百位数MOVA,BMOVB,#10DIVABMOVRESULT+1,A;除以10得十位数MOVRESULT+2,B;余数为个位数SJMP$END5.设计型实验内容①将30H、31H单元中的十六进制数,转换成ASCII码,存放到40H开始的4个单元中。ORG0000H;MOVR2,30H;MOVR3,31H;MOVR0,#40H;MAIN:MOVA,R2;ANLA,#0F0H;SWAPA;ADDA,#90H;DAA;ADDCA,#40H;DAA;MOV@R0,A;将31H中的高位转化成ASCII码INCR0;MOVA,R2;ANLA,#0FH;ADDA,#90H;DAA;ADDCA,#40H;DAA;MOV@R0,A;将30H中的低位转化成ASCII码INCR0;MOVA,R3;ANLA,#0F0H;SWAPA;ADDA,#90H;DAA;ADDCA,#40H;DAA;MOV@R0,A;将30H中的高位转化成ASCII码INCR0;MOVA,R3;ANLA,#0FH;ADDA,#90H;DAA;ADDCA,#40H;DAA;MOV@R0,A;将31H中的低位转化成ASCII码INCR0;SJMP$;END②单字节十六进制数转换为十进制数的程序设计。设单字节十六进制数存放在内部RAM30H中,结果要求存放到内部RAM40H-41H中。本题应该是40H-42H,因为该十六进制数完全有可能超过100RESULTEQU40H;ORG0000H;MOVR0,#30H;MOVA,@R0;MOVB,#100DIVABMOVRESULT,A;除以100得百位数MOVA,BMOVB,#10DIVABMOVRESULT+1H,A;除以10得十位数MOVRESULT+2H,B;余数为个位数SJMP$END③单字节压缩BCD码数转换成十六进制数的程序设计。设压缩BCD码数存放在内部RAM30H中,结果要求存放在内部RAM40H中。RESULTEQU40H;;设置存放地址ORG0000H;MOVR1,#30H;MOVA,@R1;ANLA,#0F0H;取高4位SWAPA;MOVB,#0AH;MULAB;高位乘以10MOVRESULT,A;转换高位MOVA,@R1;MOVB,#0FH;取低4位ANLA,B;ADDA,RESULT;MOVRESULT,A;转换低位SJMP$;END6.综合实验①多字节十六进制数转