微机原理程序题
- 格式:doc
- 大小:65.50 KB
- 文档页数:17
1. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sign与sinteger
均为双字变量。
if ( sinteger = = 0)
sign = = 0;
else If ( siteger > 0)
sign = 1;
else
sign = -1;
mov eax,sinteger
mov edx,sign
cmp eax,0
jnz L1
mov ebx,0
L1:cmp ebx,0
jl L2
mov ebx,1
L2:mov ebx,-1
2. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中ch1与caps 均为字节变量。
if (ch1> =’a’ && ch1< =’z’)
caps= =0;
if (ch1> =’A’ && ch1< =’Z’)
caps= =1;
mov ax,ch1
mov bx,caps
cmp ax,a
jb next
cmp ax,z
ja next
mov bx,0
next:cmp ax,A
jl done
cmp ax,Z
ja done
done:
3. 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段,其中sum与i变量均为双字变量。
sum=0;
for ( i=1;i< =100;i++)
if ( i%2= =0)
sum=sum+i;
mov ecx,i
mov ecx,1
.while(ecx<=100)
mov eax,ecx
xor edx,edx
mov ebx,2
div ebx
cmp edx,0
jnz next
add sum,ecx
next:inc ecx
.endw
1. 能被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;
include
.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
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中。
; 采用伪代码pseudo code描述算法
; 1. i=2 to 100 do
; if i is prime number then print i
; 细化如下:
; j=2 to i/2 do
; 1.1.1 if i mod j=0 then goto next i
; 1.1.2 print i
; 合理分配寄存器,i=ebx,j=ecx,edxeax做被除数,ecx做除数.
include
.data
msg byte ' List of prime number',13,10,0
msg1 byte ' Lcounter is :' ,13,10,0
blank byte ' ',0
prime dword 100 dup(?)
pcounter dword 0
.code
main proc ;主程序开始
mov esi,0
mov eax,offset msg
call dispmsg
mov ebx,2
iLoop: cmp ebx,100 ;i循环入口
ja done
mov ecx,ebx