中南大学试题
;用汇编语言实现实现冒泡排序,并将排序后的数输出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遍历排序后的数 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;SI遍历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 ;把数字转换为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 DIVDW 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,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 CMP R0,#0 ;将R0与0比较看循环是否结束 BNE LOOP ;判断循环是否结束,接受则进行下面的步骤 LDR R2,=RESULT STR R1,R2 RESULT DCD 0 STOP B STOP 第二个排序的源码附上: ;排列算法:先将所有的数据与第一个进行比较,最后取出最小的数据放到第一个内存单元中 ;然后再从第二个内存单元开始进行比较,将第二小的数据放到第二个内存单元中, ;以此内推则能将十个数据进行排列。 AREA TEXT,CODE,READWRITE ENTRY LDR R0,=DATA ;获得DATA数据的起始地址 MOV R1,R0 MOV R5,#9 ;开始的循环数目是10次,所以应该从9开始 MOV R6,R5 COMPARE 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 ;每次循环结束以后将初始的指向的内存地址后移一个单元 MOV R0,R1 ;重新初始化上个循环中的寄存器中保存的地址 SUB R5,R5,#1 ;每次循环以后上面在以后的循环中的次数都会减1 MOV R6,R5 CMP R5,#0 ;判断所有的循环是否结束 BNE COMPARE DATA DCD 9,4,6,7,8,1,3,2,0,5 STOP B STOP ARM汇编编程-实现双层for循环; AREA Block, CODE 声明代码段 ENTRY for(i = 0; i < 10; i+) for(j = i+1; j<=10; j+) z +=1 START MOV R1, #0 i = 0 MOV R0, #0 Z LOOP CMP R1, #10 i < 10 BEQ STOP ADD R2, R1, #1 j = i+1LOOP1 CMP R2, #10+1 j<=10 ADDNE R0, R0, #1 z +=1 ADDNE R2, R2, #1 j+ BNE LOOP1 ADD R1, R1, #1 i+ B LOOP STOP MOV R0, #0x18 LDR R1, =0x20026 SWI 0x123456 END 数据块拷贝,利用LDR/STR指令; num EQU 10 AREA BlockData, DATA 声明数据段src DCD 0,1,2,3,4,5,6,7,8,9 定义十个数dst SPACE 10*4 AREA Block, CODE 声明代码段 ENTRY START LDR R1, =src LDR R2, =dst MOV R3, #num LOOP LDR R0, R1, #4 STR R0, R2, #4 SUBS R3, R3, #1 BNE LOOP STOP MOV R0, #0x18 LDR R1, =0x20026 SWI 0x123456 END 汇编语言程序示例 ;例五:利用跳转表实现程序跳转;项目名:E