循环与分支程序设计

循环程序设计

循环程序的结构

循环与分支程序设计1

单重循环程序(循环次数已知)

问题: 试编制一个程序,将BX寄存器中的二进制数用十六进制的形式在屏幕上显示出来。

分析: 根据题意应该把BX的内容从左到右每四位为一组在屏幕上显示出来,显然这可以用循环结构来完成,每次循环显示一个十六进制数位,因而循环次数是已知的,计数值为4。循环体中则应包括从二进制到所显示字符的ASCII之间的转换,以及每个字符的显示,后者可以使用DOS功能调用来实现。

程序:

prognam segment							;define code segment
main proc far
		assume cs:program
start:								;starting execution addr
;set up stack for return
		push	ds					;save old data segment
		sub		ax,ax				;put zero in AX
		push	ax					;save zero on stack
;main part of program
		move	ch,4					;number of digits
rotate: move	cl,4						;set count to 4 bits
		rol		bx,cl				;left digit to right
		mov		al,bl				;move to AL
		add		al,0fh				;mask off left digit
		add		al,30h				;conver hex to ASCII
		cmp		al,3ah				;is it > 9 ?
		jl		printit				;jump if digit = 0 to 9
		add		al,7h				;digit is A to F
printit:
		mov		dl,al				;put ASCII char in DL
		mov		ah,2				;display output funct
		int		21h				;call DOS
		dec		ch				;done 4 digits?
		jnz		rotate				;not yet
		ret						;return to DOS
main	endp							;end of main part of prog.

prognam ends							;end of segment

		end						;end of assembly

单重循环程序(循环次数未知)

问题: 在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。

分析: 要测出Y中1的个数就应逐位测试。一个比较简单的办法是可以根据最高有效位是否为1来计数,然后用移位的方法把各位数逐次移到最高位去。循环的结束可以用计数值为16来控制,但更好的办法是结合上述方法可以用测试数是否为0来作为结束条件,这样可以在很多情况下缩短程序的执行时间。

程序: 方法一

;*************************************
datarea segment
addr	dw		number
number	dw		Y
count	dw		?
datarea	ends
;*************************************
prognam	segment
;-------------------------------------
main	proc	far
		assume cs:prognam,ds:datarea
start:

;set up stack for return
		push	ds
		sub		ax,ax
		push	ax
;set DS register to current data segment
		mov		ax,datarea
		mov		ds,ax
;MAIN PART OF PROGRAM GOES HERE
		mov		cx,0
		mov		bx,addr
		mov		ax,[bx]
repeat:	test	ax,0ffffh
		jz		exit
		jns		shift
		inc		cx
shift:	shl		ax,l
		jmp		repeat
exit:	mov		count,cx
		ret
main	endp
;-------------------------------------
prognam	ends
;*************************************
		end		start

方法二

		MOV  CX, 16
		MOV  BX,  0
Begin: 		SHL   AX,  1
        	JNC   Next
        	INC   BX
Next:  		LOOP  Begin

方法三

		MOV  CX,16
   		MOV  BX,0
		MOV  DX,1
AG:		TEST AX,DX
	  	JZ    NEXT
		INC   BX
NEXT:		SHL   DX,1
	  	LOOP  AG

多重循环程序

问题: 试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接受键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。

分析: 这一程序要求接受的字符从空格符开始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符。为此,设立作为标志的存储单元FLAG。一开始将其置为0,接收第一个字符后可将其置1.

程序:

;********************************************
datarea segment
	buffer		db		80 dup(?)
	flag		db		?
datarea ends
;********************************************
prognam segment
;--------------------------------------------
main	proc	far
	assume cs:prognam,ds:datarea
start:
;set up stack for return
		push	ds
		sub		ax,ax
		push	ax
;set DS register to current data segment
		mov		ax,datarea
		mov		ds,ax
;MAIN PART OF PROGRAM GOES HERE
		lea		bx,buffer
		mov		flag,0
next:	mov		ah,01
		int		21h
		test	flag,01h
		jnz		follow
		cmp		al,20h
		jnz		exit
		mov		flag,1
		jmp		next
follow:	cmp		al,20h
		jz		exit
		mov		[bx],al
		inc		bx
		jmp		next
exit:	ret
main	endp
;---------------------------------------------
prognam ends
;*********************************************
		end		start

分支程序设计


《IBM-PC汇编语言程序设计(第2版)》沈美明 温冬婵 著

Last updated