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

if (ch1> =’a’ && ch1< =’z’) caps= =0; if (ch1> =’A’ && ch1< =’Z’) caps=1; 答: ; .code ;代码段 cmp ch1 , a jb outjudge cmp ch1 , z ja done mov caps , 0 ; if (ch1> =’a’ && ch1< =’z’) outjudge: cmp ch1 , A jb done cmp ch1 , Z ja done mov caps , 1 ; if (ch1> =’A’ && ch1< =’Z’) done: ; 结束 4. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sum与i变量均为双字变量。 sum=0; for ( i=1;i< =100;i++) if ( i%2= =0) sum=sum+i; 答: ; .code ;代码段 mov eax , 0 ; 初始化eax=0 xor ecx , ecx ;用作计数器 mov ecx ,100 xor ebx , ebx ;相当于 i 的作用 mov ebx , 1 ;初始化eax=1 loop: push eax ;保存eax的值 mov eax , ebx xor edx , edx ; 用来判断余数 div 2 ;eax 除以2 cmp edx , 0 ;edx=eax mod 2 jz next ;是偶数则跳转修改参数 pop eax ;恢复eax的值 jmp next_i next: pop eax ;恢复eax的值 add eax , ebx ;eax=eax+ebx next_i: inc ebx jmp loop ;当ecx<>0时继续循环 done: mov sum eax ; 结束 5. 在N分支结构中,至少要使用N—1条 JMP指令,它的作用是什么? 答:等同于switch语句中的break用来跳到分支出口。 6. 不使用CALL指令是否可以实现子程序的调用?若可以,举例说明。 答:可以实现,通过栈来实现。将子程序入口地址压栈通过EBP+4来修改PC值来返回原程序,也就实现子程序的调用。 7. 写出3条以上的可以改变程序执行流程的指令,并简述其用途。 答: JMP 无条件跳转 19

CALL 调用子程序 RET 返回到调用函数或操作系统 INT 中断指令 8. 在子程序中,可否改变子程序的返回地址?若可以,则举例说明。 答:可以改变,通过修改栈中的 EBP+4的内容。 9. 为什么特别强调为子程序加上必要的注释? 答:完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。 5.6.应用题 1. 能被4整除但不能被100整除,或者年被400整除的年份是闰年。编程写一个完整的程序,求出2012年~2099年中的所有闰年年份,并把它们存放在数组Lyear中。 ; Win32 Console Application ;能被4整除但不能被100整除,或者年被400整除的年份是闰年。 ;编程写一个完整的程序,求出2012年~2099年中的所有闰年年份, ;并把它们存放在数组Lyear中。 ; 目的:学习如何利用条件转移指令构造复杂逻辑运算结构。 ; 算法描述 ; esi=0闰年个数计数器;ecx=2012年份计数器; ; while (ecx<2100) ; { if (year mod 4=0 and year mod 100 <>0) or (year mod 400=0) then ; {Lyear[esi]=ecx;esi++;} ; ecx++; ; } ; Lcounter=esi; ; 采用div指令求余数来判断整除性,采用带比例因子的相对寻址处理数组。 include io32.inc .data Lyear dword 100 dup(?) Lcounter dword 0 .code main proc xor esi,esi ;esi闰年个数计数器,兼做Lyear下标。 mov ecx,2012 ;ecx年份计数器。 .while (ecx<2100) mov eax,ecx xor edx,edx mov ebx,400 div ebx cmp edx,0 jz leap ;if year mod 400=0 then goto leap 20

mov eax,ecx xor edx,edx mov ebx,4 div ebx cmp edx,0 jnz next ;if year mod 4<>0 then goto next mov eax,ecx xor edx,edx mov ebx,100 div ebx cmp edx,0 jz next ;if year mod 100=0 then goto next leap: mov Lyear[esi*4],ecx inc esi mov eax,ecx call dispuid ;输出,用于验证。可以删掉 call dispcrlf ;输出,用于验证。可以删掉 next: inc ecx .endw mov Lcounter,esi mov eax,esi call dispuid ;输出,用于验证。可以删掉 call dispcrlf ;输出,用于验证。可以删掉 ret main endp ;end of main end main ;end of assembly 2. 编程写一个完整的程序,求出2~100之间的所有素数,并将它们存入Prime数组中,素数的个数存入变量Pcounter中。 ; Win32 Console Application ; 编程写一个完整的程序,求出2~100之间的所有素数, ;并将它们存入Prime数组中,素数的个数存入变量Pcounter中。 ; 目的:学习如何利用条件转移指令构造条件循环结构,多重循环的构造方法。 ; 算法描述 ; 0. Pcounter=0; ; 1. i=2 to 100 do ; 1.1 if i is prime number then Prime[Pcounter++]=i ; 细化 1.1 如下: ; 1.1 j=2 to i/2 do ; 1.1.1 if i mod j=0 then goto next i ; 1.1.2 Prime[Pcounter++]=i 21

; 合理分配寄存器,esi=0,esi素数个数计数器,兼做Prime下标; ; 采用带比例因子的相对寻址处理数组。 ; i=ebx,j=ecx,edxeax做被除数,ecx做除数。 include io32.inc .data Prime dword 100 dup(?) Pcounter dword ? .code main proc xor mov iLoop: jLoop: cmp ja mov shr esi,esi ;esi素数个数计数器,兼做Prime下标。 ebx,2 ebx,100 ;i循环入口 done ecx,ebx ecx,1 ;j=i/2 ecx,2 ;j循环入口 prime eax,ebx ;xor edx,edx cmp jb mov cdq div ecx ;被除数送edxeax,32位除法 or edx,edx ;cmp edx,0 jz nexti ;if i mod j=0 then goto next i dec ecx jmp jLoop prime: mov Prime[esi*4],ebx inc esi mov eax,ebx call dispuid ;输出,用于验证。可以删掉 call dispcrlf ;输出,用于验证。可以删掉 nexti: inc ebx ;i=i+1 jmp iLoop done: mov Pcounter,esi ret ;返回操作系统 main endp ;end of main end main ;end of assembly 3. 编程写一个完整的程序,将数组aray中的元素按逆序存放,要求程序中附加的变量最少。数据段的定义如下: .data aray dword 12,4, 168,122,-33,56,78,99,345, 66,-5 ; 逆置一个一维数组 ; 算法描述: 22