汇编 循环程序设计

编程写一个完整的程序,将数组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

arrayword类型,应该修改哪条指令?

此处输出直接输出无符号数,-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

回文串是一个正读和反读都一样的字符串,比如eyelevelnoon等。请写一个程序测试一字符串是否是回文

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中的最大值与最小值,并将它们分别存入maxmin单元中。

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(回文)是指正读和反读都一样的数或文本。例如:1112112321等,编写程序,求1010000之间所有回文数并输出。要求每行输出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

编程写一个完整的程序,求出2100之间的所有素数,并将它们存入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???  //此答案有待考证

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值