编程写一个完整的程序,将数组array中的元素按逆序存放,要求程序中附加的变量最少。数据段的定义如下:
.data
array dword 12,4, 168,122,-33,56,78,99,345, 66,-5
include vcIO.inc
.data
array dword 12,4, 168,122,-33,56,78,99,345, 66,-5
frmStr1 byte ' %5d',0
.code
main proc
mov esi,offset array
mov edi,esi
add edi,(lengthof array-1)*4
mov ecx,(lengthof array)/2
again:
mov eax,[esi]
xchg [edi],eax
mov [esi],eax
add esi,4
sub edi,4
loop again
mov esi,offset array
mov ecx,lengthof array
again2:
mov eax,[esi]
add esi,4
pushad
invoke printf,offset frmStr1, eax
popad
loop again2
pushad
invoke _getch
popad
ret
main endp
end main
若array是word类型,应该修改哪条指令?
此处输出直接输出无符号数,-33和-5无法直接输出,等后续修改完善。
include vcIO.inc
.data
array word 12,4, 168,122,-33,56,78,99,345, 66,-5
frmStr1 byte ' %5d',0
.code
main proc
mov esi,offset array
mov edi,esi
add edi,(lengthof array-1)*2
mov ecx,(lengthof array)/2
again:
mov ax,[esi]
xchg [edi],ax
mov [esi],ax
add esi,2
sub edi,2
loop again
mov esi,offset array
mov ecx,lengthof array
again2:
mov eax,[esi]
add esi,2
pushad
invoke printf,offset frmStr1, ax
popad
loop again2
pushad
invoke _getch
popad
ret
main endp
end main
编程写一个完整的程序,将数组array中的元素按逆序存放,要求程序中附加的变量最少。
算法描述
left,right分别指向数组的第一个和最后一个元素,采用首尾交换。
1. left=0,right=n-1 ;
2. while (left<right do)
{ swap a[left],a[right] ;left++;right--} ;
合理分配寄存器:left=esi,right=edi
采用带比例因子的相对寻址处理数组
include vcIO.inc
.data
array dword 12,4, 168,122,-33,56,78,99,345, 66,-5
frmStr1 byte ' %5d',0
.code
main proc
xor esi,esi
mov edi,(lengthof array - 1)
mov ecx,(lengthof array)/2
again:
mov eax,array[esi*4]
xchg array[edi*4],eax
mov array[esi*4],eax
inc esi
dec edi
loop again
mov esi,offset array
mov ecx,lengthof array
again2:
mov eax,[esi]
add esi,4
pushad
invoke printf,offset frmStr1, eax
popad
loop again2
pushad
invoke _getch
popad
ret
main endp
end main
“回文串”是一个正读和反读都一样的字符串,比如“eye”、“level”、“noon”等。请写一个程序测试一字符串是否是“回文”
include vcIO.inc
.data
palstr byte 'huiuh',0
frmStr1 byte '%c',0
frmStr2 byte 'not pal',0
frmStr3 byte 'is pal',0
.code
main proc
mov esi,offset palstr
mov edi,esi
sub edi,2
add edi,lengthof palstr
mov ecx,(lengthof palstr)/2
again:
xor eax,eax
xor ebx,ebx
mov al,[esi]
mov bl,[edi]
cmp al,bl
jnz notpal
loop again
pushad
invoke printf,offset frmStr3
popad
jmp fin
notpal:
pushad
invoke printf,offset frmStr2
popad
fin:
pushad
invoke _getch
popad
ret
main endp
end main
Fibonacci numbers的定义:
f1=1,f2=1, fn= fn-1 + fn-2 n>=3
编程输出Fibonacci numbers的前20项。
include vcIO.inc
.data
frmStr byte '第%d个Fibonacci数:%d',0ah,0ah,0
.code
main proc
mov eax,1
mov ebx,1
pushad
invoke printf,offset frmStr,eax,ebx
popad
inc eax
pushad
invoke printf,offset frmStr,eax,ebx
popad
inc eax
mov ecx,1
again:
xchg ebx,ecx
add ebx,ecx
pushad
invoke printf,offset frmStr,eax,ebx
popad
inc eax
cmp eax,21
jnz again
pushad
invoke _getch
popad
ret
main endp
end main
在不产生溢出的情况下n的最大值是多少?
46项
能被4整除但不能被100整除,或者年被400整除的年份是闰年。编程写一个完整的程序,求出2012年~2099年中的所有闰年年份,并把它们存放在数组Lyear中。
include vcIO.inc
.data
leapyear dw 50 dup(0)
frmStr1 byte ' address=%d',0ah,0
frmStr byte ' %d',0ah,0
.code
main proc
mov esi,offset leapyear
mov edi,esi
mov eax,2012
again:
cmp eax,2100
jz fin
mov ebx,eax
mov ecx,4h
xor edx,edx
div ecx
mov eax,ebx
inc eax
cmp edx,0
jz addyear
jmp noyear
addyear:
mov [esi],ebx
add esi,4
noyear:
jmp again
fin:
again2:
cmp esi,edi
jz fina
pushad
mov eax,[edi]
invoke printf,offset frmStr,eax
popad
add edi,4
jmp again2
fina:
pushad
invoke _getch
popad
ret
main endp
end main
编程写一个完整的程序统计字符串msg中的空格的个数与小写字母的个数,并分别将它们存入space单元与char单元中并输出。
include vcIO.inc
.data
hello byte 'Hello MASM32',0
frmStr byte 'spacenum=%d',0ah,0
frmStr1 byte 'lowcase=%d',0ah,0
.code
main proc
xor eax,eax
xor ebx,ebx
mov esi,offset hello
mov edi,esi
mov ecx,lengthof hello
add edi,ecx
again:
cmp esi,edi
jz fin
mov cl,[esi]
inc esi
cmp cl,' '
jz spaceadd
cmp cl,'a'
jl finoneloop
cmp cl,'z'
jl lowcaseadd
jmp finoneloop
spaceadd:
inc eax
jmp finoneloop
lowcaseadd:
inc ebx
jmp finoneloop
finoneloop:
jmp again
fin:
pushad
invoke printf,offset frmStr,eax
invoke printf,offset frmStr1,ebx
popad
pushad
invoke _getch
popad
ret
main endp
end main
编程写一个完整的程序,求数组aray中的最大值与最小值,并将它们分别存入max和min单元中。
include vcIO.inc
.data
array dword 12,4, 168,122,-33,56,78,99,345, 66,-5
frmStr byte 'max=%d',0ah,0
frmStr1 byte 'min=%d',0ah,0
min dw ?
max dw ?
.code
main proc
mov esi,offset array
mov edi,esi
add edi,(lengthof array -1)*4
mov eax,[esi]
add esi,4
mov ebx,[esi]
add esi,4
cmp eax,ebx
jl nochange
xchg eax,ebx
nochange:
again:
cmp esi,edi
jz fin
mov ecx,[esi]
cmp eax,ecx
jl changemin
cmp ecx,ebx
jl changemax
return1:
jmp oneloopover
changemin:
mov eax,ecx
jmp return1
changemax:
mov ebx,ecx
jmp return1
oneloopover:
add esi,4
jmp again
fin:
pushad
invoke printf,offset frmStr,eax
invoke printf,offset frmStr1,ebx
popad
pushad
invoke _getch
popad
ret
main endp
end main
array是一无符号数数组,数据段的定义如下。编程写一个完整的程序求出数组元素中偶数的和,并将它存入esum单元中 。
include vcIO.inc
.data
array dword 12,4, 168,122,33,56,78,99,345, 66,5
frmStr byte 'sum=%d',0ah,0
.code
main proc
mov esi,offset array
mov edi,esi
add edi,(lengthof array -1)*4
xor ebx,ebx
xor ecx,ecx
mov ecx,2h
again:
cmp esi,edi
jz fin
xor edx,edx
xor eax,eax
mov eax,[esi]
div ecx
cmp edx,0
jz addeven
jmp oneloopover
addeven:
add ebx,[esi]
oneloopover:
add esi,4
jmp again
fin:
pushad
invoke printf,offset frmStr,ebx
;invoke printf,offset frmStr1,ebx
popad
pushad
invoke _getch
popad
ret
main endp
end main
有一个首地址为string的字符串 ,剔除string中所有的空格字符。请从字符串最后一个字符开始逐个向前判断、并进行处理。
include vcIO.inc
.data
string byte 'H e l lo MAS M32',0
frmStr byte ' before:%s',0ah,0
frmStr1 byte ' after:%s',0ah,0
.code
main proc
pushad
invoke printf,offset frmStr,offset string
popad
mov esi,offset string
mov edi,esi
add edi,(lengthof string-1)
mov edx,edi
again:
cmp esi,edi
jz fin
mov al,[edi]
cmp al,' '
jnz oneloopover
mov ecx,edi
again2:
cmp ecx,edx
jz again2over
mov bl,[ecx]
mov bh,[ecx+1]
xchg bl,bh
mov [ecx],bl
mov [ecx+1],bh
inc ecx
jmp again2
again2over:
mov eax,0h
mov [edx],eax
dec edx
jmp oneloopover
oneloopover:
dec edi
jmp again
fin:
pushad
invoke printf,offset frmStr1,offset string
popad
pushad
invoke _getch
popad
ret
main endp
end main
palindrome(回文)是指正读和反读都一样的数或文本。例如:11、121、12321等,编写程序,求10到10000之间所有回文数并输出。要求每行输出10个数。
include vcIO.inc
.data
i dword ?
shang dword ?
yu dword ?
frmStr1 byte ' %d',0
frmStr2 byte ' ',0ah,0
num dword 0
.code
main proc
mov eax,10
mov i,eax
again:
mov eax,i
cmp eax,10000
jz fin
xor ebx,ebx
xor ecx,ecx
again2:
cmp eax,0
jz oneloopover
mov cx,10
xor edx,edx
div cx
mov shang,eax
mov yu,edx
xchg ebx,eax
mov edx,10
mul edx
xchg ebx,eax
add ebx,yu
mov eax,shang
jmp again2
oneloopover:
mov eax,i
cmp eax,ebx
jz printnum
inc eax
mov i,eax
jmp again
printnum:
pushad
mov ecx,num
inc ecx
mov num,ecx
xchg ecx,eax
xor edx,edx
xor ebx,ebx
mov ebx,10
div ebx
cmp edx,0
jz printline
jmp printval
printline:
invoke printf,offset frmStr2
mov eax,0
mov num,eax
printval:
mov ebx,i
invoke printf,offset frmStr1,ebx
popad
inc eax
mov i,eax
jmp again
fin:
pushad
invoke _getch
popad
ret
main endp
end main
编程写一个完整的程序,求出2~100之间的所有素数,并将它们存入Prime数组中,素数的个数存入变量Pcounter中。
include vcIO.inc
.data
frmStr1 byte 'Pcounter=%d',0
frmStr2 byte ' %d',0ah,0
prime byte 50 dup(0)
num dword 0
i byte 2
j byte 2
.code
main proc
mov esi,offset prime
mov edi,esi
mov bl,i
again:
cmp bl,101
jz fin
mov bh,j
again2:
cmp bh,bl
jz overagain2
xor eax,eax
xor edx,edx
mov al,bl
mov cl,bh
div cl
cmp ah,0
jz overloop
inc bh
jmp again2
overagain2:
jmp addnum
overloop:
inc bl
jmp again
addnum:
mov eax,num
inc eax
mov num,eax
mov [esi],bl
inc bl
inc esi
jmp again
fin:
pushad
mov eax,num
invoke printf,offset frmStr1,eax
popad
pushad
again3:
cmp esi,edi
jz fin2
mov eax,[edi]
invoke printf,offset frmStr2,al
inc edi
;inc bl
jmp again3
popad
fin2:
pushad
invoke _getch
popad
ret
main endp
end main
回答问题:
1. 在循环结构中,如何避免无限循环情况的发生?
适当位置加入跳转语句
2. 下面的程序段中,循环体将被执行多少次?如果的初值为-100,循环体将被执行多少次?
mov ecx,0
loopTest: mov eax,ecx
call dispuid
loop loopTest
0 总-100??? //此答案有待考证