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 19
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 20
; 合理分配寄存器,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 ; 逆置一个一维数组 ; 算法描述: 21
; left,right分别指向数组的第一个和最后一个元素,采用首尾交换。 ; 1. left=0,right=n-1 ; ; 2. while left ; 2. for i=1 to n-1 do ; 2.1 if maxa[i] then min=a[i] ; 合理分配寄存器:采用loop循环,ecx=lengthof array -1 ; max=eax=a[0],min=ebx=a[0]; ; esi=1,做下标,采用带比例因子的相对寻址处理数组。 .686 .model flat,stdcall option casemap:none includelib msvcrt.lib printf PROTO C : dword,:vararg .data array dword 12,4,-168,122,33,56,78,99,345,-66,-5 max dword ? min dword ? fmtStr byte ' max=%d min=%d',13,10,0 ;格式描述串 .code main proc mov ecx,lengthof array -1 mov eax,array[0] ;eax:max mov ebx,eax ;ebx:min mov esi,1 ;数组下标 again: cmp eax,array[esi*4] jge small ;if max= small: cmp ebx,array[esi*4] jle next mov ebx,array[esi*4] next: inc esi loop again mov max,eax mov min,ebx invoke printf,offset fmtStr,eax,ebx ret ;return to Windows main endp ;end of main end main ;end of assembly 5. 编程写一个完整的程序统计msg中的空格的个数与小写字母的个数,并分别将它们存入space单元与char单元中。数据段的定义如下: .data msg byte 'I love XUT !',13,10,0 space dword ? 23 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库微机原理试题库及答案2013N修改版 - 图文(5)在线全文阅读。
相关推荐: