中南大学试题Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】;用汇编语言实现实现冒泡排序,并将排序后的数输出DATAS SEGMENTA dw 3 10 8 56 22 36 1 43 31 3N=$-A ;计算数字所占的字节数DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV SI,0 ;SI遍历数字;前一个数的地址MOV CX,N/2-1 ;设置循环次数,M(M=N/2)个数需要,循环M-1次CALL BUBBLE ;调用BUBBLE将原来的数排序;输出排序后的数MOV CX,N/2 ;循环M次输出排序后的M个数MOV SI,0 ;SI遍历排序后的数MOV DI,0 ;用DI记录数字的位数MOV BP,N+5 ;BP用于遍历存储的转化后的字符的位置SHOW: PUSH CX ;循环次数入栈MOV DX,0 ;由于将要进行16位除需要置高16位为0 MOV AX,[SI] ;低16位为排序后的数CALL DTOC ;调用DTOC将十进制数转换为字符串CALL SHOW_STR ;调用SHOW_STR将一个数转化得到的字符串输出ADD SI,2 ;下一个数POP CX ;循环次数出栈栈LOOP SHOWMOV AH,4CHINT 21H;冒泡排序BUBBLE PROCL1: PUSH CX ;将循环次数入栈LEA SI,A ;SI遍历DATAS数据段的数字L2: MOV AX,A[SI] ;将前一个数存于AXCMP AX,A[SI+2] ;比较前后两个数JBE NEXT ;如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,A[SI+2] ;否则,交换前后两个数的位置MOV A[SI],AXNEXT:ADD SI,2 ;下一个数LOOP L2 ;注意内层循环的次数已经确定了POP CX ;将循环次数出栈LOOP L1 ;下一轮比较RETBUBBLE ENDP; 将十进制数转换为字符串并储存起来DTOC PROCS:MOV CX,10 ;将除数10,放入CX中CALL DIVDW ;调用DIVDW程序ADD CL,30H ;把数字转换为ASCII码,这样就能显示了MOV DS:[BP],CL ;把ASCII码放到内存中INC DI ;用DI记录循环的次数PUSH AX ;将低16位入栈ADD AX,DX ;将高位与低位相加,接着判断是否已经除尽JZ BACK ;除尽后返回调用处POP AX ;将低16位出栈DEC BP ;逆序存放转化后的字符,便于主程序调用SHOW_STR JMP SBACK:POP AX ;为了得到正确的IP值,需要出栈一次RETDTOC ENDP;子程序定义开始,功能是分离被除数的各个位的数字;公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/NDIVDW PROCPUSH AX ;低16位入栈MOV AX,DX ;将高16位写入AX,MOV DX,0 ;将高16位置零DIV CX ;将新的数除10,MOV BX,AX ;将商int(H/N)转移到BX,默认余数rem(H/N)在DX POP AX ;将低16位出栈,DIV CX ;将[rem(H/N)*65536+L]除10,默认余数在DXMOV CX,DX ;将余数转移到CXMOV DX,BX ;将商int(H/N)转移到dx,相当于int(H/N)*65536RET ;子程序定义结束DIVDW ENDP;实现字符串的输出SHOW_STR PROCS2:MOV AH,2 ;输出数字转化后的字符串MOV DL,DS:[BP]INT 21HINC BP ;顺序输出DEC DI ;数字的位数减一JZ OK ;字符串输出完了就结束JMP S2 ;否则继续输出OK:MOV AH,2 ;输出空格MOV DL,0INT 21HRETSHOW_STR ENDPCODES ENDSEND START第一个累加和的源码:AREA TEXT,CODE,READWRITEENTRYMOV R0,#100 ;循环数目MOV R1,#0 ;初始化数据LOOPADD R1,R1,R0 ;将数据进行相加,获得最后的数据SUBS R0,R0,#1 ;循环数据R0减去1CMP R0,#0 ;将R0与0比较看循环是否结束BNE LOOP ;判断循环是否结束,接受则进行下面的步骤LDR R2,=RESULTSTR R1,[R2]RESULTDCD 0STOPB STOP第二个排序的源码附上:;排列算法:先将所有的数据与第一个进行比较,最后取出最小的数据放到第一个内存单元中;然后再从第二个内存单元开始进行比较,将第二小的数据放到第二个内存单元中,;以此内推则能将十个数据进行排列。
AREA TEXT,CODE,READWRITEENTRYLDR R0,=DATA ;获得DATA数据的起始地址MOV R1,R0MOV R5,#9 ;开始的循环数目是10次,所以应该从9开始MOV R6,R5COMPAREADD R0,R0,#4 ;将R0所存储的地址+4表示为下一个要比较的数的地址 SUB R6,R6,#1 ;循环1次减1LDR R2,[R1] ;将放在寄存器中的数据取出进行大小比较LDR R3,[R0]CMP R3,R2MOVCC R7,R2 ;如果后面的地址的数值比前一个小则交换他们的数据MOVCC R2,R3MOVCC R3,R7STR R2,[R1] ;将数据存储到相应的内存单元中STR R3,[R0]CMP R6,#0 ;看每次的循环是否结束BNE COMPAREADD R1,R1,#4 ;每次循环结束以后将初始的指向的内存地址后移一个单元 MOV R0,R1 ;重新初始化上个循环中的寄存器中保存的地址SUB R5,R5,#1 ;每次循环以后上面在以后的循环中的次数都会减1MOV R6,R5CMP R5,#0 ;判断所有的循环是否结束BNE COMPAREDATADCD 9,4,6,7,8,1,3,2,0,5STOPB STOP;;ARM汇编编程-实现双层for循环;AREABlock,CODE;声明代码段ENTRY;for(i = 0; i < 10; i++);for(j = i+1; j<=10; j++);z +=1STARTMOV R1, #0; i = 0MOV R0, #0; ZLOOPCMP R1, #10; i < 10BEQ STOPADD R2, R1, #1; j = i+1LOOP1CMP R2, #10+1; j<=10ADDNE R0, R0, #1; z +=1 ADDNE R2, R2, #1; j++BNE LOOP1ADD R1, R1, #1;i++B LOOPSTOPMOV R0, #0x18LDR R1, =0x20026SWI 0x123456END;;数据块拷贝,利用LDR/STR指令;num EQU10 AREABlockData,DATA;声明数据段srcDCD0,1,2,3,4,5,6,7,8,9;定义十个数dstSPACE10*4AREABlock,CODE;声明代码段ENTRYSTARTLDRR1, =srcLDR R2, =dstMOV R3, #numLOOPLDR R0, [R1], #4STR R0, [R2], #4SUBS R3, R3, #1BNE LOOPSTOPMOV R0, #0x18LDR R1, =0x20026SWI 0x123456END汇编语言程序示例;例五:利用跳转表实现程序跳转;项目名:,文件名:———————————————————————————————————————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位补码例七:汇编语言与C/C++的混和编程项目名:文件名:文件名:———————————————————————————————————————;AREAAsm_C,CODE,READONLYENTRYLDRSP,=0x4000IMPORT__mainBL__mainB.END ———————————————————————————————————————#include <>int main(){printf("Hello world\n");return 0;}中南大学考试试卷(答案)2012--2013 学年 2 学期时间 100 分钟2013 年 6 月 4 日嵌入式系统课程 32 学时学分考试形式:开卷专业年级:测控 10 级总分 100 分,占总评成绩 70 % 注:此页不作答题纸,请将答案写在答题纸上一.填空题(每空 1 分,共 20 分)1. 嵌入性、专用性与计算机系统是嵌入式系统的 3 个基本要素。