微机原理及应用A试题库及答案(4)

2018-11-17 21:50

11. 汇编语言中不允许递归调用子程序。F 12. 与高级语言中的自定义函数不同,汇编语言中的子程序不能将计算的结果返给主程序F 13. 汇编语言中,子程序嵌套调用就是递归调用。F

14. 在LOOP指令构成的循环结构中,允许修改ECX的值。T 15. 指令CALL或RET的执行,不改变程序执行的流程。T

16. 在软件中只使用一次的功能编写成子程序完全没有必要。F 17. 在执行CALL指令时,硬件自动将断点地址压入堆栈中。F

18. 在高级语言中,若多重循环出现\交叉”的错误,编译系统通常会给出提示来。若汇编语言程序中也出现\交叉”错误时,汇编程序也会给出提示来。T 四.填空

1. JMP指令根据目标地址的寻址方式,可以分成三种类型:相对寻址、直接寻址和间接寻址。

2. 假设在平展存储模型下,EBX=1256H,双字变量TABLE的偏移地址是20A1H,线性地址32F7H处存放3280H,执行指令“JMP EBX” 后EIP=1256H,执行指令“JMP TABLE[EBX]”后EIP=3280H。

3. “CMP EAX,3721H”指令之后是JZ指令,发生转移的条件是EAX=3721H,此时ZF=1。 4. JMP指令根据目标地址的寻址方式,可以分成三种类型:相对寻址、间接寻址和直接寻址,通常相对寻址方式使用的最多。

5. 循环结构程序一般有三个部分组成,它们是循环初始,循环体和循环控制部分。

6. 条件转移指令JE Label的测试标志位是ZF,条件转移指令JNO Label的测试标志位是_OF__。

7. .过程定义开始是“TEST PROC”语句,则过程定义结束的语句是TEST ENDP。宏定义开始是“DISP MACRO”语句,则宏定义结束的语句是ENDM。

8. 利用堆栈传递子程序参数的方法是固定的,在子程序中通常是利用寄存器EBP来访问栈中的参数,采用的寻址方式是间接寻址。

9. 调用程序和子程序之间的信息传送称为__参数__,而当传递的信息很大时通常通过地址来进行传递。

32

10. 在LOOP Label 指令构成的循环中,若ECX的初值为0,则循环体将被执行__2_次;若

32 -100

ECX的初值为—100,则循环体将被执行(2)次。

11. 只要堆栈空间允许,子程序嵌套调用的层次_无限制_,子程序也可调用本身,这称为__递归调用_。

12. 通常在子程序的开始部分要保护__入口参数___寄存器,但用做出口参数的通用寄存器则__不能保护和恢复__。

13. 通常在子程序中的参数分为两种类型,分别称为_入口参数__和 __出口参数__。 14. 通常在子程序中至少要有一条_返回__指令用于返回主程序,而汇编程序在汇编时并不检测__返回_指令是否存在。

15. 在主程序中,采用“JMP subName”指令可以_转到_子程序subName,但子程序结束后需返回。 五.简答题

1. 是什么特点决定了目标地址的相对寻址方式应用最多?

当同一个程序被操作系统安排到不同的存储区域执行时,指令间的位移没有改变,目标地址采用相对寻址可方便操作系统的灵活调度。

2. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sign与sinteger均为双字变量。

if ( sin teger = = 0) sign = = 0;

else If ( siteger > 0) sign = 1; else

sign = -1;

3. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中ch1与caps均为字节变量。

if (ch1> =’a’ && ch1< =’z’) caps= =0;

if (ch1> =’A’ && ch1< =’Z’) caps= =1;

4. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sum与i变量均为双字变量。 sum=0;

for ( i=1;i< =100;i++) if ( i%2= =0) sum=sum+i;

5. 在N分支结构中,至少要使用N—1条 JMP指令,它的作用是什么?

用于实现结束前一个分支回到共同的出口作用。

6. 不使用CALL指令是否可以实现子程序的调用?若可以,举例说明。

调用系统服务子程序一般不使用CALL指令, 而是使用中断调用指令 7. 写出3条以上的可以改变程序执行流程的指令,并简述其用途。

1)JMP指令;无任何先决条件下,就能使程序改变执行顺序; 2)Jcc指令;根据指定条件,确定程序是否发生转移; 3)LOOP指令;作为计数器,控制循环;

4)CALL指令;在主程序中实现子程序的调用。

8.在子程序中,可否改变子程序的返回地址?若可以,则举例说明。

RET N 该指令允许返回地址出栈后修改堆栈的指针。 9. 为什么特别强调为子程序加上必要的注释?

完整的子程序注释可方便程序员调用该子程序,子程序注释包括子程序名、子程序功能、入口参数和出口参数、调用注意事项和其他说明等。 六.应用题

1. 能被4整除但不能被100整除,或者年被400整除的年份是闰年。编程写一个完整的程序,求出2012年~2099年中的所有闰年年份,并把它们存放在数组Lyear中。 include io32.inc .data

year dword ?

prompt byte ' Enter the year :',0 msg byte ' is leap year .',0 msg1 byte ' is not leap year .',0 .code

main proc ;主程序开始

mov eax,offset prompt call dispmsg

call readsid ;读入一个年份 mov year,eax

call dispsid ;输出年份 xor edx,edx mov ebx,400 div ebx cmp edx,0

jz leap ;if year mod 400=0 then goto leap

mov eax,year xor edx,edx mov ebx,4 div ebx cmp edx,0

jnz noleap ;if year mod 4<>0 then goto noleap

mov eax,year xor edx,edx mov ebx,100 div ebx cmp edx,0

jnz leap ;if year mod 100<>0 then goto leap noleap: mov eax,offset msg1 jmp display

leap: mov eax,offset msg display: call dispmsg call dispcrlf

ret ;返回操作系统

main endp ;主程序结束

end main ;end of assembly

2. 编程写一个完整的程序,求出2~100之间的所有素数,并将它们存入Prime数组中,素数的个数存入变量Pcounter中。 include io32.inc .data

msg byte ' List of prime number',13,10,0 blank byte ' ',0 .code

main proc ;主程序开始

mov eax,offset msg call dispmsg mov ebx,2

iLoop: cmp ebx,100 ;i循环入口 ja done

mov ecx,ebx shr ecx,1 ;j=i/2

jLoop: cmp ecx,2 ;j循环入口 jb print mov eax,ebx

cdq ;xor edx,edx

div ecx ;被除数送eax,32位除法 or edx,edx ;cmp edx,0

jz nexti ;if i mod j=0 then goto next i dec ecx jmp jLoop print: mov eax,ebx

call dispuid ;显示素数i的值 mov eax,offset blank call dispmsg ;显示空格 nexti: inc ebx ;i=i+1 jmp iLoop done: call dispcrlf

ret ;返回操作系统

main endp ;主程序结束

end main ;end of assembly

3. 编程写一个完整的程序,将数组aray中的元素按逆序存放,要求程序中附加的变量最少。数据段的定义如下: .data

aray dword 12,4, 168,122,-33,56,78,99,345, 66,-5 4. 编程写一个完整的程序,求数组aray中的最大值与最小值,并将它们分别存入max和min单元中。数据段的定义如下: .data

aray dword 12,4,-168,122,-33,56,78,99,345,-66,-5 min dword ? max dword ? .code

main proc ;主程序开始

mov eax,offset msg

call dispmsg ;显示字符串

mov ecx,lengthof array ;数组元素的个数送ecx xor esi,esi ;esi间址指针

mov ax,array[esi*type array] ;注意比例因子!

again: cmp ax,array[esi*type array]

jge next ;注意区分有符号数和无符号数! mov ax,array[esi*type array]

next: inc esi ;esi指向下一个元素 loop again

movsx eax,ax ;注意符号位的扩展! call dispsid call dispcrlf

ret ;返回操作系统

main endp ;主程序结束

end main ;end of assembly(最大值)

5. 编程写一个完整的程序统计msg中的空格的个数与小写字母的个数,并分别将它们存入space单元与char单元中。数据段的定义如下: .data

msg byte 'I love XUT !',13,10,0 space dword ? char dword ?

6. 编程写一个完整的程序,将字符串msg中所有的小写字母转换为大写字母。数据段的定义如下: .data

msg byte 'I love XUT !',13,10,0

7. array是一无符号数数组,数据段的定义如下。要求:编程写一个完整的程序求出数组元素中偶数的和,并将它存入esum单元中。 .data

array dword 12,34,123,78,43,234,79,86,98,20 esum dword ?

8. “回文串”是一个正读和反读都一样的字符串,比如“eye”、“level”、“noon”等。请写一个程序测试一字符串是否是“回文”, 是“回文”则显示“Y”,否则显示“N”。 显示一个字符的子程序为:dispc,入口参数:AL=要显示个字符的SACII码。

9. 回文是指正读和反读都一样的数或文本。例如:11、121、12321等,编写程序,求10到10000之间所有回文数并输出。显示一个无符号数的子程序为:dispuid,入口参数:EAX=要显示无符号数的值。 include io32.inc .data

blank byte ' ',0


微机原理及应用A试题库及答案(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2017胶黏剂与涂料复习资料

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: