微机原理及应用A试题库及答案修改版 - 图文 下载本文

; 算法描述: ; 1. scanP=tailP=sLen-2; 数组下标从0开始 ; 2. while (scanP>=0) do ; if sStr[scanP]==' ' then ; for moveP=scanP+1 to tailP do ; sStr[moveP-1]=sStr[moveP]; ; tailP--; ; else ; scanP++; ; 3. print sStr; ; 合理分配寄存器:tailP=edi,scanP=esi ,moveP=ebx ; 采用相对寻址处理数组。 ; Q:若将此算法改为子程序,如何修改? Include io32.inc .data sStr byte ' I Love XAUT ! ',0dh,0ah,0 .code main proc lea eax,sStr ; 显示处理前的字符串 call dispmsg mov mov .while cmp jnz edi,lengthof sStr-2 ;尾指针tailP esi,edi ;从右向左扫描工作指针scanP sdword ptr esi>=0 ;sdword ptr esi指示将esi按有符号数处理 sStr[esi],20h ; 检测是否是空格 next lea ebx,[esi+1] ;移动字符工作指针moveP=scanP+1 .while ebx<=edi ;循环移动开始 mov al,sStr[ebx] mov sStr[ebx-1],al ;字符向前移一个位置 inc ebx .endw dec edi ;尾指针tailP向前移一个位置 next:dec esi ;向左扫描工作指针scanP向前移一个位置 .endw mov byte ptr sStr[edi+1],0 ;串结束标志 lea eax,sStr ;显示处理后的字符串 call dispmsg ret ;return to Windows main endp ;end of main end main ;end of assembly 14. 编写一子程序,将一个32位二进制数用8位十六进制形式在屏幕上显示出来。采用堆栈方法传递这个32位二进制数,并写主程序验证它。显示一个字符的子程序为:dispc,入口参数:AL=要显示个字符的SACII码。 35

; Win32 Console Application ; 将一个32位二进制数转换为8位十六进制, ; 并在屏幕上显示出来的子程序。 ; 目的:学习子程序的构造与参数的传递方法。 include io32.inc .data dvar dword 1234abc8h ;table byte '0123456789abcdef' ;采用查表法进行转换 .code main proc push dvar ;堆栈传递参数 call btoh ret ;return to Windows main endp ;end of main btoh proc ; function: 将一个32位二进制数转换为8位十六进制, ; 并在屏幕上显示出来。 ; Receives: 堆栈中获取要转换为十六进制的32位数 ; Returns: 无。 ; 算法思想:采用循环左移,一次移动4位。 ; 利用最低4位的值查表,转换为十六进制的数ASCII码。 ; 算法描述: ; 1. ecx=8; ; 2. while ecx>0 ; { ror eax,4; ; ebx=eax; ; eax=eax and 0fh; ; al=table[eax]; ; print al; ; eax=ebx; ; ecx--;} push ebp mov ebp,esp ; 建立访问栈参数的指针基准 push ebx ; 保护子程序中要使用的寄存器 push ecx mov ecx,8 mov eax,[ebp+8] again: rol eax,4 ;eax的最高的4位移动到最低的4位 mov ebx,eax and eax,0fh ;保留eax的最低的4位 36

mov al,table[eax] call dispc mov eax,ebx loop again call dispcrlf restore: pop ecx ; 恢复子程序中使用过的寄存器 pop ebx pop ebp ret 1*4 table byte '0123456789abcdef' ;采用查表法进行转换 btoh endp ;end of Bubble end main ;end of assembly 15. 编程写一个名为Bubble的冒泡排序子程序,主子程序间的参数传递通过堆栈完成;并写主程序验证它。显示一个无符号数的子程序为:dispuid,入口参数:EAX=要显示无符号数的值。 ; Win32 Console Application ; 冒泡排序子程序。 ; 目的:学习子程序的构造与参数的传递方法。 include io32.inc .data array dword 12,4,168,122,-33,56,78,99,345,66,-5 count equ lengthof array .code main proc push offset array ;array的首地址进栈,传地址 push count ;数组元素的个数进栈,传值 call Bubble xor esi,esi ;以下的while循环用于验证。可以删掉 .while (esi

; 注意:[ebp+8]是最后一个压入栈中的参数! ; 以[ebp+8]为基准,从栈中获取其它的参数。 ; Bubble Sort的思想:从第一个元素开始, ; 相邻的两个元素依次进行比较,若关系不对则交换。 ; 这样较小的数就向上移动,而较大的数则向下移动, ; 这就是冒泡排序的由来。经过N-1次比较, ; 最大的数被移动到最后一个位置, ; 这个过程称之为一趟扫描。 ; 显然,经过N-1趟扫描,排序过程就结束了; ; 并且每趟扫描的比较次数比前一趟减少一次。 ; 算法描述: ; 1. ecx=n-1; ; 2. while ecx>0 ; { esi=array;数组的首地址 ; ebx=ecx; ; while ebx>0 ; { if [esi]>[esi+4] then ; swap [esi],[esi+4] ; ; esi=esi+4;ebx--; ; } ; ecx--;} ; push ebp mov ebp,esp ; 建立访问栈参数的指针基准 push eax ; 保护子程序中要使用的寄存器 push ebx push ecx push esi push edi mov esi,[ebp+12] ;array的首地址 mov edi,esi mov ecx,[ebp+8] ;数组元素的个数 dec ecx again: mov esi,edi ;esi=array的首地址 mov ebx,ecx .while (ebx>0) mov eax,[esi] cmp eax,[esi+4] ; 比较两个相邻的元素 jl next xchg eax,[esi+4] mov [esi],eax ; 交换两个相邻的元素next: add esi,4 ; esi指向下一个元素 38