1.将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段;编写一完整的汇编语言程序验证转换的正确性,其中sign与sinteger均为双字变量。
if (sinteger == 0)
sign = 0;
else if ( siteger > 0)
sign = 1;
else
sign = -1;
.data
signter dword ?
mysign dword ?
frmStr1 byte '%d',0
frmStr2 byte '%d',10,0
.code
main proc
invoke scanf,offset frmStr1,offset signter
mov eax,signter
cmp eax,0
jnz l1
mov mysign,0
jmp done
l1:
cmp eax,0
jg l2
mov mysign,-1
jmp done
l2:
mov mysign,1
jmp done
done:
pushad
invoke printf, offset frmStr2,mysign
invoke _getch
popad
ret
main endp
end main
2.将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段;编写一完整的汇编语言程序验证转换的正确性,其中ch1与caps均为字节变量。
if (ch1> =’a’ && ch1< =’z’)
caps= =0;
if (ch1> =’A’ && ch1< =’Z’)
caps=1;
3.将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段;编写一完整的汇编语言程序验证转换的正确性,其中sum与i均为双字变量。
sum=0;
for ( i=1;i< =100;i++)
if ( i%2= =0)
sum=sum+i;
提示:采用div指令求余数
.data
i dword 1h
sum dword 0h
frmStr byte '%d',10,0
.code
main proc
mov ecx,i
mov ebx,sum
again:
cmp ecx,100
ja done
mov eax,ecx
xor edx,edx ;edx置零,sub edx,edx
mov bx,2
div bx ;被除数为edx,且要求被除数位数为除数的2倍
cmp edx,0
jnz next
add sum,ecx
next:
inc ecx
jmp again
done:
invoke printf,offset frmStr,sum
ret
main endp
end main
4.输入一个年份(调用readuid子程序或scanf函数),判断其是否是闰年。 提示:采用div指令求余数,伪代码描述如下: read year
if (year mod 4=0 and year mod 100 <>0)
or (year mod 400=0) then
print year ,'is leap year. '
else
print year ,'is not leap year. '
.data
year dword ?
frmStr1 byte '%d',0
frmStr2 byte 'is leap year',0ah,0
frmStr3 byte 'is not leap year',0ah,0
frmStr4 byte 'input year',10,0
.code
main proc
invoke printf, offset frmStr4
invoke scanf,offset frmStr1,offset year
mov eax,year
xor edx,edx
mov ebx,400
div ebx
cmp edx,0
je doneyes
mov eax,year
xor edx,edx
mov ebx,4
div ebx
cmp edx,0
jne doneno
mov eax,year
xor edx,edx
mov ebx,100
div ebx
cmp edx,0
jz doneno
jnz doneyes
doneyes:
pushad
invoke printf,offset frmStr2
popad
ret
doneno:
pushad
invoke printf,offset frmStr3
popad
ret
main endp
end main
5. 采用无条件和条件转移指令构造while和do while循环结构,完成下面的求和任务并输出sum和n(sum ,n为双字)。
sum=1+2+3+….+n ;
n=100
思考题:假设sum 为双字无符号整数,在和不溢出的情况下求出n的最大值;输出sum和n的值。
.data
sum dword 0
n dword 1h
frmStr byte 'sum=%d,n=%d',10,0
.code
main proc
mov ecx,n
mov eax,sum
again:
cmp ecx,100
ja done
add eax,ecx
inc ecx
jmp again
done:
pushad
invoke printf, offset frmStr,eax,ecx
invoke _getch
popad
ret
main endp
end main
6.从键盘上输入3个有符号的双字整数,编写一完整的程序按照又大到小的顺序输出这3个数。 提示:采用xchg指令交换两个变量的值,伪代码描述如下:
1. read a,b,c
2. if (a<b) then exchage( a,b)
3. if (a<c) then exchage( a,c)
4. if (b<c) then exchage( b,c)
5. print a,b,c
.data
a sdword ?
b sdword ?
cc sdword ?
frmStr1 byte '%d%d%d',0
frmStr2 byte '%d>%d>%d',10,0
frmStr3 byte '请输入三个整数',10,0
.code
main proc
invoke printf,offset frmStr3
invoke scanf,offset frmStr1,offset a,offset b,offset cc
mov eax,a
mov ebx,b
mov ecx,cc0
cmp eax,ebx
jl l1
a2: cmp eax,ecx
jl l2
a3: cmp ebx,ecx
jl l3
jmp done
l1:
xchg eax,ebx
jmp a2
l2:
xchg eax,ecx
jmp a3
l3:
xchg ebx,ecx
jmp done
done:
pushad
invoke printf, offset frmStr2,eax,ebx,ecx
invoke _getch
popad
ret
main endp
end main
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)