;用汇编语言实现实现冒泡排序,并将排序后的数输出DATASSEGMENTAdw3108562236143313N=$-A;计算数字所占的字节数DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVSI,0;SI遍历数字;前一个数的地址MOVCX,N/2-1;设置循环次数,M(M=N/2)个数需要,循环M-1次CALLBUBBLE;调用BUBBLE将原来的数排序;输出排序后的数MOVCX,N/2;循环M次输出排序后的M个数MOVSI,0;SI遍历排序后的数MOVDI,0;用DI记录数字的位数MOVBP,N+5;BP用于遍历存储的转化后的字符的位置SHOW:PUSHCX;循环次数入栈MOVDX,0;由于将要进行16位除需要置高16位为0MOVAX,[SI];低16位为排序后的数CALLDTOC;调用DTOC将十进制数转换为字符串CALLSHOW_STR;调用SHOW_STR将一个数转化得到的字符串输出ADDSI,2;下一个数POPCX;循环次数出栈栈LOOPSHOWMOVAH,4CHINT21H;冒泡排序BUBBLEPROCL1:PUSHCX;将循环次数入栈LEASI,A;SI遍历DATAS数据段的数字L2:MOVAX,A[SI];将前一个数存于AXCMPAX,A[SI+2];比较前后两个数JBENEXT;如果前一个数小于或等于后一个数则继续本轮的比较XCHGAX,A[SI+2];否则,交换前后两个数的位置MOVA[SI],AXNEXT:ADDSI,2;下一个数LOOPL2;注意内层循环的次数已经确定了POPCX;将循环次数出栈LOOPL1;下一轮比较RETBUBBLEENDP;将十进制数转换为字符串并储存起来DTOCPROCS:MOVCX,10;将除数10,放入CX中CALLDIVDW;调用DIVDW程序ADDCL,30H;把数字转换为ASCII码,这样就能显示了MOVDS:[BP],CL;把ASCII码放到内存中INCDI;用DI记录循环的次数PUSHAX;将低16位入栈ADDAX,DX;将高位与低位相加,接着判断是否已经除尽JZBACK;除尽后返回调用处POPAX;将低16位出栈DECBP;逆序存放转化后的字符,便于主程序调用SHOW_STRJMPSBACK:POPAX;为了得到正确的IP值,需要出栈一次RETDTOCENDP;子程序定义开始,功能是分离被除数的各个位的数字;公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/NDIVDWPROCPUSHAX;低16位入栈MOVAX,DX;将高16位写入AX,MOVDX,0;将高16位置零DIVCX;将新的数除10,MOVBX,AX;将商int(H/N)转移到BX,默认余数rem(H/N)在DXPOPAX;将低16位出栈,DIVCX;将[rem(H/N)*65536+L]除10,默认余数在DXMOVCX,DX;将余数转移到CXMOVDX,BX;将商int(H/N)转移到dx,相当于int(H/N)*65536RET;子程序定义结束DIVDWENDP;实现字符串的输出SHOW_STRPROCS2:MOVAH,2;输出数字转化后的字符串MOVDL,DS:[BP]INT21HINCBP;顺序输出DECDI;数字的位数减一JZOK;字符串输出完了就结束JMPS2;否则继续输出OK:MOVAH,2;输出空格MOVDL,0INT21HRETSHOW_STRENDPCODESENDSENDSTART第一个累加和的源码:AREATEXT,CODE,READWRITEENTRYMOVR0,#100;循环数目MOVR1,#0;初始化数据LOOPADDR1,R1,R0;将数据进行相加,获得最后的数据SUBSR0,R0,#1;循环数据R0减去1CMPR0,#0;将R0与0比较看循环是否结束BNELOOP;判断循环是否结束,接受则进行下面的步骤LDRR2,=RESULTSTRR1,[R2]RESULTDCD0STOPBSTOP第二个排序的源码附上:;排列算法:先将所有的数据与第一个进行比较,最后取出最小的数据放到第一个内存单元中;然后再从第二个内存单元开始进行比较,将第二小的数据放到第二个内存单元中,;以此内推则能将十个数据进行排列。AREATEXT,CODE,READWRITEENTRYLDRR0,=DATA;获得DATA数据的起始地址MOVR1,R0MOVR5,#9;开始的循环数目是10次,所以应该从9开始MOVR6,R5COMPAREADDR0,R0,#4;将R0所存储的地址+4表示为下一个要比较的数的地址SUBR6,R6,#1;循环1次减1LDRR2,[R1];将放在寄存器中的数据取出进行大小比较LDRR3,[R0]CMPR3,R2MOVCCR7,R2;如果后面的地址的数值比前一个小则交换他们的数据MOVCCR2,R3MOVCCR3,R7STRR2,[R1];将数据存储到相应的内存单元中STRR3,[R0]CMPR6,#0;看每次的循环是否结束BNECOMPAREADDR1,R1,#4;每次循环结束以后将初始的指向的内存地址后移一个单元MOVR0,R1;重新初始化上个循环中的寄存器中保存的地址SUBR5,R5,#1;每次循环以后上面在以后的循环中的次数都会减1MOVR6,R5CMPR5,#0;判断所有的循环是否结束BNECOMPAREDATADCD9,4,6,7,8,1,3,2,0,5STOPBSTOP;;ARM汇编编程-实现双层for循环;AREABlock,CODE;声明代码段ENTRY;for(i=0;i10;i++);for(j=i+1;j=10;j++);z+=1STARTMOVR1,#0;i=0MOVR0,#0;ZLOOPCMPR1,#10;i10BEQSTOPADDR2,R1,#1;j=i+1LOOP1CMPR2,#10+1;j=10ADDNER0,R0,#1;z+=1ADDNER2,R2,#1;j++BNELOOP1ADDR1,R1,#1;i++BLOOPSTOPMOVR0,#0x18LDRR1,=0x20026SWI0x123456END;;数据块拷贝,利用LDR/STR指令;numEQU10AREABlockData,DATA;声明数据段srcDCD0,1,2,3,4,5,6,7,8,9;定义十个数dstSPACE10*4AREABlock,CODE;声明代码段ENTRYSTARTLDRR1,=srcLDRR2,=dstMOVR3,#numLOOPLDRR0,[R1],#4STRR0,[R2],#4SUBSR3,R3,#1BNELOOPSTOPMOVR0,#0x18LDRR1,=0x20026SWI0x123456END汇编语言程序示例;例五:利用跳转表实现程序跳转;项目名:Example5.mcp,文件名:Example5.s———————————————————————————————————————AREAJump,CODE,READONLYnumEQU2ENTRYstartMOVR0,#0MOVR1,#3MOVR2,#2BLarithfuncB.arithfuncCMPR0,#numMOVHSPC,LRADRR3,JumpTableLDRPC,[R3,R0,LSL#2]JumpTableDCDDoAddDCDDoSubDoAddADDR0,R1,R2MOVPC,LRDoSubSUBR0,R1,R2MOVPC,LREND3、存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。解:MOVR0,#0x400000MOVR1,#0LPLDRBR2,[R0,R1]CMPR2,#0x61BLONEXTCMPR2,#0x7B;0x61---0x7A为小写字母的ASCSUBLOR2,R2,#0x20STRBLOR2,[R0,R1]NEXTADDR1,R1,#1CMPR1,#100BNELP8、编写一简单ARM汇编程序段,实现1+2+…+100的运算。解:MOVR2,#100MOVR1,#0LOOPADDR1,R1,R2;R1中为累加和SUBSR2,R2,#1;R2控制循环BNELOOP4、编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。解:MOVR0,#0x400000LDRR1,[R0];取第1个数LDRR2,[R0,#4];取第2个数CMPR1,R2;两个数相比较MOVHIR1,#1;R1大MOVLOR1,#-1;R1小MOVEQR1,#0;两个数相等STRR1,[R0,#8]7、编写一程序,存储器中从0x400200开始有一个64位数。(1)将取反,再存回原处;(2)求其补码,存放到0x400208处。解:LDRR0,=0x400200LDRR2,=0xFFFFFFFFLDRR1,[R0];取低32位数EORR1,R1,R2;取反STRR1,[R0];存低32位反码ADDSR1,R1,#1;又加1为求补STRR1,[R0,#8];存低32位补码LDRR1,[R0,#4];取高32位数EORR1,R1,R2;取反STRR1,[R0,#4];存高32位反码ADCR1,R1,#0;高32位求补STRR1,[R0,#12];存高32位补码Example7Example7.OC例七:汇编语言与C/C++的混和编程项目名:Example7.mcp文件名:Example7_asm.s文件名:Example7_c.c———————————————————————————————————————;Example7_asm.sAREAAsm_C,CODE,READONLYENTRYLDRSP,=0x4000IMPORT__mainBL__mainB.END———————————————————————————————————————#includestdio.hintmain(){printf(Helloworld\n);return0;}中南大学考试试卷(答案)2012--2013学年2学期时间100分钟2013年6月4日嵌入式系统课程32学时2.0学分考试形式:开卷专业年级:测控10级总分100分,占总评成绩70%注:此页不作答题纸,请将答案写在答题纸上一.填空题(每空1分,共20分)1.嵌入性、专用性与计算机系统是嵌入式系统的3个基本要素。2.ARM7微处理器采用冯.诺依曼总线架构;ARM9微处理器采用哈佛总线架构。3.ARM有三种含义,分别是公司名称、一类处理器的通称与技术名称。4.在RISC中,完成数据在寄存器和外部存储器之间的传输采用独立的load与store指令。5.ARM核有两个指令集,分别是ARM、THUMB。6.ARM公司提供的专门用于ARM相关应用开发和调试的综合性软件为:ADS1.2。7.ARM微处理器的工作状态一般有两种,两种状态之间的切换采用BX指令。8.当程序状态寄存器的内容为0xA030时,说明处理器运行THUMB状态和用户模式下。9.ARM核中的R14(或LR)寄存器,常用作保存子程序的返回地址。10.汇编语言的源程序主要由指令、伪指令、语句标号与注释等四部分组成。二.简答题(56分,每小题7分)1.简述嵌入式系统的概念、组成及特点。答:嵌入式系统是以应用为中心,以计算机技术为基础,采用可裁减软硬件,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成。其特点有1)嵌入式系统通常是面向特定应用的2)嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物