中南大学试题

上传人:101****457 文档编号:98817155 上传时间:2019-09-14 格式:DOCX 页数:18 大小:36.41KB
返回 下载 相关 举报
中南大学试题_第1页
第1页 / 共18页
中南大学试题_第2页
第2页 / 共18页
中南大学试题_第3页
第3页 / 共18页
中南大学试题_第4页
第4页 / 共18页
中南大学试题_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《中南大学试题》由会员分享,可在线阅读,更多相关《中南大学试题(18页珍藏版)》请在金锄头文库上搜索。

1、;用汇编语言实现实现冒泡排序,并将排序后的数输出DATAS SEGMENT A dw 3 10 8 56 22 36 1 43 31 3 N=$-A ;计算数字所占的字节数DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS MOV DS,AX MOV 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遍

2、历排序后的数 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 SHOW MOV AH,4CH INT 21H;冒泡排序 BUBBLE PROCL1:PUSH CX;将循环次数入栈LEA SI,A;S

3、I遍历DATAS数据段的数字L2: MOV AX,ASI;将前一个数存于AXCMP AX,ASI+2;比较前后两个数JBE NEXT;如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,ASI+2;否则,交换前后两个数的位置MOV ASI,AXNEXT:ADD SI,2;下一个数 LOOP L2;注意内层循环的次数已经确定了 POP CX;将循环次数出栈 LOOP L1;下一轮比较 RETBUBBLE ENDP; 将十进制数转换为字符串并储存起来 DTOC PROC S:MOV CX,10 ;将除数10,放入CX中 CALL DIVDW ;调用DIVDW程序 ADD CL,30H ;

4、把数字转换为ASCII码,这样就能显示了 MOV DS:BP,CL ;把ASCII码放到内存中 INC DI ;用DI记录循环的次数 PUSH AX ;将低16位入栈 ADD AX,DX ;将高位与低位相加,接着判断是否已经除尽 JZ BACK ;除尽后返回调用处 POP AX;将低16位出栈 DEC BP ;逆序存放转化后的字符,便于主程序调用SHOW_STRJMP S BACK:POP AX ;为了得到正确的IP值,需要出栈一次 RET DTOC ENDP;子程序定义开始,功能是分离被除数的各个位的数字;公式:X/N=int(H/N)*65536+rem(H/N)*65536+L/N DI

5、VDW PROC PUSH 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,默认余数在DX MOV CX,DX ;将余数转移到CX MOV DX,BX ;将商int(H/N)转移到dx,相当于int(H/N)*65536 RET ;子程序定义结束 DIVDW ENDP ;实现字符串的输出 SHOW_STR PROCS2:MOV AH

6、,2;输出数字转化后的字符串 MOV DL,DS:BP INT 21H INC BP;顺序输出 DEC DI;数字的位数减一 JZ OK;字符串输出完了就结束 JMP S2;否则继续输出OK:MOV AH,2;输出空格 MOV DL,0 INT 21H RETSHOW_STR ENDP CODES ENDSEND START第一个累加和的源码: AREA TEXT,CODE,READWRITE ENTRY MOV R0,#100 ;循环数目 MOV R1,#0 ;初始化数据LOOP ADD R1,R1,R0 ;将数据进行相加,获得最后的数据 SUBS R0,R0,#1 ;循环数据R0减去1 C

7、MP R0,#0 ;将R0与0比较看循环是否结束 BNE LOOP ;判断循环是否结束,接受则进行下面的步骤 LDR R2,=RESULT STR R1,R2RESULT DCD 0STOP B STOP第二个排序的源码附上: ;排列算法:先将所有的数据与第一个进行比较,最后取出最小的数据放到第一个内存单元中 ;然后再从第二个内存单元开始进行比较,将第二小的数据放到第二个内存单元中, ;以此内推则能将十个数据进行排列。 AREA TEXT,CODE,READWRITE ENTRY LDR R0,=DATA ;获得DATA数据的起始地址 MOV R1,R0 MOV R5,#9 ;开始的循环数目是

8、10次,所以应该从9开始 MOV R6,R5COMPARE ADD R0,R0,#4 ;将R0所存储的地址+4表示为下一个要比较的数的地址 SUB R6,R6,#1 ;循环1次减1 LDR R2,R1 ;将放在寄存器中的数据取出进行大小比较 LDR R3,R0 CMP R3,R2 MOVCC R7,R2 ;如果后面的地址的数值比前一个小则交换他们的数据 MOVCC R2,R3 MOVCC R3,R7 STR R2,R1 ;将数据存储到相应的内存单元中 STR R3,R0 CMP R6,#0 ;看每次的循环是否结束 BNE COMPARE ADD R1,R1,#4 ;每次循环结束以后将初始的指向

9、的内存地址后移一个单元 MOV R0,R1 ;重新初始化上个循环中的寄存器中保存的地址 SUB R5,R5,#1 ;每次循环以后上面在以后的循环中的次数都会减1 MOV R6,R5 CMP R5,#0 ;判断所有的循环是否结束 BNE COMPAREDATA DCD 9,4,6,7,8,1,3,2,0,5STOP B 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

10、 R1, #10; i 10BEQ STOPADD R2, R1, #1; j = i+1LOOP1CMP R2, #10+1; j=10ADDNE R0, R0, #1; z +=1ADDNE R2, R2, #1; j+BNE LOOP1ADD R1, R1, #1;i+B LOOPSTOPMOV R0, #0x18LDR R1, =0x20026SWI 0x123456END;数据块拷贝,利用LDR/STR指令;num EQU10AREABlockData,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汇编语言程序示例;例五:利用跳转表实现程序跳转;项目名:E

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号