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

sub dl,20h ; and dl,5fh mov [esi],dl next: inc esi ; 指向下一个字符 loop again invoke printf,offset fmtStr,offset msg ret ;return to Windows main endp ;end of main end main ;end of assembly 7. array是一无符号数数组,数据段的定义如下。要求:编程写一个完整的程序求出数组元素中偶数的和,并将它存入esum单元中。 .data array dword 12,34,123,78,43,234,79,86,98,20 esum dword ? ; Win32 Console Application ; 求数组中所有偶数元素的和。 ; 目的:学习简单的关于分支与数组处理的算法。 ; 算法描述 ; 1. esum=0; ; 2. for i=0 to n-1 do ; if a[i] is evennunber then esum=esum+a[i]; ; 判断偶数,采用 test 指令测试最低位。 ; 合理分配寄存器:采用loop循环,ecx=lengthof array ; esum=eax=0,esi=0,做下标,采用带比例因子的相对寻址处理数组。 .686 .model flat,stdcall option casemap:none includelib msvcrt.lib printf PROTO C : dword,:vararg .data array dword 12,34,123,78,43,234,79,86,98,20 esum dword ? fmtStr byte ' esum=%d',13,10,0 ;格式描述串 .code main proc mov ecx,lengthof array xor eax,eax ;esum=eax=0 mov esi,eax ;数组下标 again: mov ebx,array[esi*4] test ebx,1 jnz next ;if a[i] is evennunber then esum=esum+a[i]; 27

add eax,ebx ;注意:转换成汇编语言时,测试的是不是偶数时则取下一个数测试。 next: inc esi loop again mov esum,eax invoke printf,offset fmtStr,esum ret ;return to Windows main endp ;end of main end main ;end of assembly 8. “回文串”是一个正读和反读都一样的字符串,比如“eye”、“level”、“noon”等。请写一个程序测试一字符串是否是“回文”, 是“回文”则显示“Y”,否则显示“N”。 显示一个字符的子程序为:dispc,入口参数:AL=要显示个字符的SACII码。 ; Win32 Console Application palindrome ; 测试一字符串是否是“回文”, 是“回文”则显示“Y”,否则显示“N”。 ; 算法描述: ; left,right分别指向串的第一个和最后一个元素,采用首尾比较。 ; 1. left=0,right=n-1 ,flag='Y' ; ; 2. while lefta[right--] then ; { flag= 'N'; break;} ; 3. printf flag ; 合理分配寄存器:left=esi,right=edi ,flag=al='Y' ; 采用相对寻址处理数组。 include io32.inc .data msg byte 'level',0 count equ lengthof msg .code main proc mov esi,0 ;left指针 mov edi,count-2 ;right指针,串长不包括结束标志0 mov al,'Y' ; flag=al='Y' .while (esi

call dispcrlf ret ;return to Windows main endp ;end of main end main ;end of assembly 9. 回文是指正读和反读都一样的数或文本。例如:11、121、12321等,编写程序,求10到10000之间所有回文数并输出。显示一个无符号数的子程序为:dispuid,入口参数:EAX=要显示无符号数的值。 ; Win32 Console Application ; 求10到10000之间所有回文数并输出。 ; 目的:学习如何利用条件转移指令构造条件循环结构,多重循环的构造方法。 ; 算法思想:采用div指令把一个整数N的每一位分离出来,注意, ; 此时得到的是N的各个位的逆序序列。然后,将这个逆序序列再组合成一个新的整数M, ; 若M=N,则N是回文数。 ; 算法描述 ; 1. ecx=10 to 1000 do ; 1.1 eax=ecx被除数;ebx=10除数;esi=0新生成的数的初值。 ; 1.2 while eax<>0 do ; 1.2.1 edx=0;div ebx;esi=esi*10+edx ; 1.3 if ecx=esi then print esi include io32.inc .code main proc mov ecx,10 mov ebx,ecx ;ebx=10除数 .repeat xor esi,esi ;esi=0,是新生成的数的初值 mov eax,ecx ;eax被除数 .while (eax!=0) xor edx,edx ;edx被除数的高32位 div ebx imul esi,10 add esi,edx ;逆序生成新数,esi=esi*10+edx .endw cmp esi,ecx jne next mov eax,ecx call dispuid call dispcrlf next: inc ecx .until (ecx>10000) ret ;return to Windows 29

main endp ;end of main end main ;end of assembly 10. 编程写一个名为Prime的子程序,用于测试一个整数是否是素数,主子程序间的参数传递通过堆栈完成。调用Prime子程序求出2~100之间的所有素数,并将它们存入Parray数组中,素数的个数存入变量Pcounter中。 ; Win32 Console Application ; 利用子程序求2~100之间的所有素数。 ; 目的:学习子程序的构造与参数的传递方法。 include io32.inc .data Prime dword 100 dup(?) Pcounter dword ? flag byte ? .code main proc xor esi,esi ;esi素数个数计数器,兼做Prime下标。 mov ecx,2 ;循环控制变量 .while (ecx<=100) push offset flag ;flag的地址进栈,传地址 push ecx ;ecx进栈,传值 call prime cmp flag,1 jne next mov Prime[esi*4],ecx inc esi mov eax,ecx call dispuid ;输出,用于验证。可以删掉 call dispcrlf ;输出,用于验证。可以删掉 next: inc ecx .endw mov Pcounter,esi ret ;return to Windows main endp ;end of main prime proc ; function: 判断一个无符号整数x是否是素数 ; Receives: 从栈获取无符号整数x及标志变量flag的地址 ; Returns: if x is prime number then flag=1 else flag=0 ; 注意:[ebp+8]是最后一个压入栈中的参数! ; 以[ebp+8]为基准,从栈中获取其它的参数。 ; 算法描述: ; 1.flag=1; 30