实验五 循环程序设计.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档