武汉理工大学《微机原理》课程设计说明书
计算部分流程图如图
将ax中内容赋值给cx
bx加上ax存于ax中 N
bx是否为0 将0赋值给ax,1赋值给bx bl减去30H,将字符转换成数字 开始 将ibuf+2便宜地址给si ax清零 Y 将最后一个字节赋值给$,以便将字符串输出
输出转换 N 将ax与ax相与是否得0
Y 结束
图3
主程序流程图
5
武汉理工大学《微机原理》课程设计说明书
输出流程图如下:
开始
图4 输出流程图
输出OUTPUT 将bx赋值给dx输出结果 跳转至start进行重复计算 结束
设计好流程图后,成功将程序的过程理清楚,给程序设计和调试带来了方便。
4.程序设计及分析
4.1 输入程序
根据报告要求和设计的方案需要,设计了输入10到99的累加和程序段,并且判断是否出错的程序段,程序如下如下:
lea dx,message ;输入提示语句 mov ah,09h int 21h mov ah,07h int 21h
cmp al,'Q' ;判定是否为Q je exit ;若是Q执行跳转 cmp al,'q' ;判定是否为q
6
武汉理工大学《微机原理》课程设计说明书
je exit ;若是q执行跳转 lea dx,input mov ah,09h int 21h
mov bl,0ffh
mov ibuf+5,bl ;
lea dx,ibuf mov ah,0ah int 21h mov si,dx mov bl,[si+5]
cmp bl,0ffh ;存在
jne error ;mov bl,[si+2] ;cmp bl,30h ;jna error ;cmp bl,3ah ;jnb error
mov bl,[si+3] ;cmp bl,2fh ;jna error cmp bl,3ah jnb error jmp correct error:
lea dx,ERROR_MESS ;
将ibuf里第三位数置为0ffh 与第三位进行比较判断是否有三位判定是否出错
判定输入是否为小于10的数 十位跟零比较
小于等于0就跳到错误 大于9就会错误 个位跟零比较 小于0就错误 出错提示
7武汉理工大学《微机原理》课程设计说明书
mov ah,09h int 21h jmp start exit: mov ah,4ch int 21h
此段程序主要是将输入的数字移动到ibuf这个变量里然后进行判断输入的数字是否在允许计算范围内。si+5表示第三位,si+2表示第一位,si+3表示第二位,分
别与这三位进行比较判定是否错误。
4.2 求数字累加之和程序
为求累加求和,设计了一下代码段: correct: mov cl,ibuf+1 xor ch,ch
mov si,offset ibuf+2
mov ax,0 ;循环运算前的初始化
again: ; (((0*10 * a0)*10 + a1)*10 + a2) mov dx,10
mul dx ;在做乘法的过程中不用考虑dx,因为输入的数为0~99,所以dx总是为0
mov bl,byte ptr [si] ;取出该字符的ASCLL码 sub bl,30h ;将其减去30H得到数值 add al,bl
adc ah,0 ;在做加法是要考虑是否有进位 inc si loop again
mov cx,ax mov ax,0
8
武汉理工大学《微机原理》课程设计说明书
mov bx,1
loop2: add ax,bx inc bx
loop loop2;这个循环就实现了sum = 1 + 2 + ... + n的操作了
mov bx,offset obuf+7
mov byte ptr [bx],'$';将最后一个字节赋值为'$'以便将数字字符串输出出来。
mov cx,10 jmp loop1 loop1 : mov dx,0
div cx ;(ax <- ax/10) ax 中存放的是商,汇编中16进制就可以当做10进制来运算
add dl,30h ; dl中存放的是余数 dec bx ;将指针前移一个字节 mov [bx],dl ;将余数放在字符串的末尾 or ax,ax ;当ax为0时结束
jnz loop1 ;当ZF==0时跳转,jump not zero dec bx
mov byte ptr [bx],0dh dec bx
mov byte ptr [bx],0ah ;在字符串的前面加上回车换行。
此部分主要为计算1加到n的算法程序,而程序解释已写入代码中。
9