实验五 循环程序设计.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五循环程序设计
一、试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是空格符,则退出程序;如果是空格符,则开始接收键入的字符并顺序存放在首地址为BUUFER 的缓冲区中(空格不保存),直到接收到第二个空格为止。
datarea segment
rl db 0dh,0ah,'$'
buffer db 80 dup(?),’$’
flag db ?
datarea ends
progname segment
assume cs:progname,ds:datarea
main proc far
start: push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
lea bx,buffer
mov flag,0
next:mov ah,01
int 21h
test flag,01h ;是第一个字符吗?标志单元为1,表示输入的不是第一个字符
jnz follow ;不是第一个字符则转。。
cmp al,20h ;第一个字符是空格吗?
jnz exit ;第一个字符不是空格则退出
mov flag,1 ;第一个字符是空格标志单元置1
jmp next ;等待输入下一个字符
follow:cmp al,20h ;非第一次输入的字符是空格吗?
jz disp ;exit ;
mov[bx],al ;不是空格,则将输入的字符保存到首地址为BUFFER的缓冲区。
inc bx
jmp next
disp:lea dx,rl
mov ah,9
int 21h
lea dx,buffer
mov ah,9
int 21h
exit:ret
main endp
progname ends
end start
二、从键盘输入两个十进制数,转换成二进制数进行加法运算,两数相加的结果输出在屏幕上. (空格或逗号作为两数的的分隔符).
data segment
bini dw ?
result dw ?
decasc db 5 dup(?)
flag db 0
data ends
code segment
assume cs:code,ds:data
main proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov bx,0 ;BX中保存转化的中间结果,初始BX=0.(((Di*10)+Di-1)*10+......+D0) new: mov flag,0
newchar:mov ah,1
int 21h ;等待键盘输入
push ax
sub al,30h ;
jl s1 ;输入字符小于零,为非0-9的数,则转移
cmp al,9
jg s1 ;输入字符大于9,为非0-9的数,则转移
cbw ;将AL中的字节字符扩展到AX为字
xchg ax,bx ;AX和BX中的数进行交换(原AX中为Di-1,BX中为Di)
mov cx,10 ;
mul cx ;
xchg ax,bx ;乘十后的结果交换到BX中,既为(Di*10)
add bx,ax ;作((Di*10)+Di-1)运算,结果在BX中
jmp newchar ;转等待键盘输入
s1: pop ax
cmp flag,1 ;标志位为1吗?
jz add1 ;为1转
cmp al,20h
jz sf ;是空格转
cmp al,','
jnz sbini ;
sf: mov bini,bx ;
mov flag,1 ;置标志位
mov bx,0
jmp newchar ;
add1: add bx,bini
sbini: mov result,bx;保存二进制数结果到内存单元
mov ax,0000h
;****************************************************************** binidec:mov dx,result ; 将二进制数取到DX中,准备转换成十进制ASCAII码mov si,offset decasc-1;
skip:inc si
mov ax,dx ;把要转换的二进制数送到AX
mov dx,0000h
mov cx,10
div cx ;AX中的二进制数除以十
xchg ax,dx ;将余数从DX中交换到AX中,而商交换到DX中
add al,30h ;转换成ASCAII码
mov [si],al ;保存一位十进制ASCAII码
cmp dx,0000h ;判断商为零吗
jne skip
next:cmp si,offset decasc+4 ;不满五位高位补零
jz disp
inc si
mov al,30h
mov [si],al
jmp next
;*********************************************************
disp:mov cx,5
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
lop: mov dl,[si]
mov ah,2
int 21h
dec si
loop lop
exit: mov ah,4ch
int 21h
main endp
code ends
end main