循环与分支程序设计
循环程序设计
循环程序的结构
单重循环程序(循环次数已知)
问题: 试编制一个程序,将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