实验五,六范例与讲评
|
在实验的过程中,如果大家都能按照提示,一步一步的完成小要求,可以轻松的写出这个程序,
下面是上一届同学写的程序与设计思想, 当然,程序在刚才的测试求和求平均中表现有些小异常,但是这已经不重要,因为只要算法和思路掌握了,进行相应的修改绝对不成问题。
DATAS SEGMENT
MESS DB 'PLEASE ENTER THE NUMBERS :'
DB 0DH,0AH,'$'
buff DB 100 ;放键盘输入的ASCII码
DB ?
DB 100 DUP('$')
S1 DW 10 DUP(?) ;放正数
S2 DW 10 DUP(?) ;放负数
X1 DB 2 DUP(0) ;放正数和
X2 DB 2 DUP(0) ;放负数和
Z1 DB 0 ;放字符总数
W3 DB 'Positive numbers :'
Y1 DB 0
db 0dh,0ah
db 'negative numbers :' ;放正数个数
Y2 DB 0
DB 0DH,0AH
;放负数个数
DB 'The summary is : '
X3 DB 3 DUP(0) ;ZONGHE
db 0dh,0ah
db 'the average is : '
db 0dh,0ah
w1 db 3 dup(0)
db ' '
w2 db 3 dup(0)
db '$'
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT STACK
STA DW 50 DUP(0)
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,09H
INT 21H
MOV DX,OFFSET BUFF
MOV AH,0AH
INT 21H
MOV BX,DX
MOV CL,[BX+1]
MOV Z1,CL
MOV CH,0H
MOV SI,BX
ADD SI,2H ;SI指向第一个字符
ADD SI,CX ;SI指向回车符
INC SI ;SI指向回车后的第一个字符,设置结束符
MOV BYTE PTR[SI],0AH
ADD DX,02H
MOV AH,09H
INT 21H
LEA SI,S1
LEA DI,S2
SUB SI,2
SUB DI,2
SUB CX,CX
ADD BX,1
P1:INC BX ;按反顺序存放+12 -13格式,高位在后21 31
CMP BYTE PTR[BX],'-'
JE STORE2
STORE1 :ADD SI,2
INC CL
ADD BX,2
CMP BYTE PTR[BX],0DH
JE STORE12
CMP BYTE PTR[BX],' '
JE STORE13
MOV DL,[BX]
MOV [SI],DL
MOV DL,[BX-1]
MOV [SI+1],DL
INC BX
CMP BYTE PTR[BX],0DH
JE MATH
JMP P1
STORE13 :MOV DL,[BX-1]
MOV [SI],DL
JMP P1
STORE12 :MOV DL,[BX-1]
MOV [SI],DL
JMP MATH
STORE2 :ADD DI,2
INC CH
ADD BX,2
CMP BYTE PTR[BX],0DH
JE STORE22
CMP BYTE PTR[BX],' '
JE STORE23
MOV DL,[BX]
MOV [DI],DL
MOV DL,[BX-1]
MOV [DI+1],DL
INC BX
CMP BYTE PTR[BX],0DH
JE MATH
JMP P1
STORE23 :MOV DL,[BX-1]
MOV [DI],DL
JMP P1
STORE22 :MOV DL,[BX-1]
MOV [DI],DL
JMP MATH
MATH :
MOV BYTE PTR[Y1],CL
MOV BYTE PTR[Y2],CH
LEA SI,S1
LEA DI,S2
SUB CX,CX
ZJIAHE :MOV CL,BYTE PTR[Y1]
Z: CLC
MOV AL,BYTE PTR[X1+1]
ADD AL,BYTE PTR[SI]
AAA
MOV BYTE PTR[X1+1],AL
MOV AL,BYTE PTR[X1]
ADC AL,BYTE PTR[SI+1]
AAA
MOV BYTE PTR[X1],AL
ADD SI,02H
LOOP Z
FJIAHE :MOV CL,BYTE PTR[Y2]
F : CLC
MOV AL,BYTE PTR[X2+1]
ADD AL,BYTE PTR[DI]
AAA
MOV BYTE PTR[X2+1],AL
MOV AL,BYTE PTR[X2]
ADC AL,BYTE PTR[DI+1]
AAA
MOV BYTE PTR[X2],AL
ADD DI,02H
LOOP F
CLC
JIANFA : MOV AL,BYTE PTR[X1+1]
SUB AL,BYTE PTR[X2+1]
AAS
MOV BYTE PTR[X3+2],AL
MOV AL,BYTE PTR[X1]
SBB AL,BYTE PTR[X2]
AAS
MOV BYTE PTR[X3+1],AL
JC FF
MOV BYTE PTR[X3],'+'
MOV BYTE PTR[W1],'+'
MOV BYTE PTR[W2],'+'
JMP CHUFA
FF : MOV BYTE PTR[X3],'-'
MOV AX,0000H
SUB AL,BYTE PTR[X3+2]
AAS
MOV BYTE PTR[X3+2],AL
MOV AL,00H
SBB AL,BYTE PTR[X3+1]
AAS
MOV BYTE PTR[X3+1],AL
MOV BYTE PTR[W1],'-'
MOV BYTE PTR[W2],'-'
JMP CHUFA
CHUFA : MOV CL,BYTE PTR[Y1]
ADD CL,BYTE PTR[Y2]
MOV AL,BYTE PTR[X3+2]
MOV AH,BYTE PTR[X3+1]
AAD
DIV CL
MOV DL,AL
MOV DH,AH
CMP AL,0AH
JC FCUN
MOV AH,0H
MOV CL,10
DIV CL
MOV BYTE PTR[W1+1],AL
MOV BYTE PTR[W1+2],AH
JMP P
FCUN :MOV BYTE PTR[W1+2],AL
P: MOV AL,DH
CMP AL,0AH
JC FCUN1
MOV AH,0H
DIV CL
MOV BYTE PTR[W2+1],AL
MOV BYTE PTR[W2+2],AH
JMP JIEGUO
FCUN1 :MOV BYTE PTR[W2+2],AL
JMP JIEGUO
JIEGUO : ADD BYTE PTR[X3+2],30H
ADD BYTE PTR[X3+1],30H
ADD BYTE PTR[W1+1],30H
ADD BYTE PTR[W1+2],30H
ADD BYTE PTR[W2+1],30H
ADD BYTE PTR[W2+2],30H
ADD BYTE PTR[Y1],30H
ADD BYTE PTR[Y2],30H
MOV DX,OFFSET W3
MOV AH,09H
INT 21H
;此处输入代码据段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
以下是设计思路:
程序可进行运算的范围是:
(-99~99)之间,商可以为两位数,且结果包括总和,商,余数,均为带符号数.正数负数分别不超过九个
因为这里没有设置个数的2-10字码转换。
设计思想:
1.读取字符串
2.分两个数组存放字符数据 如果输入格式为:-12 +23 -24回车
则在正数数组中存放格式为:23
则在正数数组中存放格式为:1224
只放字符,不加任何标志.实际上存的是数据的各位的ASCII码.
并设置变量计算正数和负数的个数.便于除法中求出除数的大小.
3.正数数组求和,负数数组求和.结果分别存放在两个单元中.按ASCII码存储.
4.正数总和减去负数总和,至此完成了求和.按非压缩BCD码存储.
5.作除法.这里若除得的商AL>9,则要进行二进制转为BCD码的转换.不过只有两位,非常容易.
6.存储各个结果,要把未转为ASCII码的数据转换过来.并进行一些格式的修饰.
接下来指出同学们在做实验的时候容易出现的问题。 1.使用其他的模拟器或调试编译工具,使得程序在那些环境中能工作,而在masm5汇编条件下编译通不过,这主要是模拟器根本没有100%的可信度,而且其环境也比真实的PC机理想的多,由于其编译器的容错能力,使得你的程序在有错的情况下仍然能正常工作。而其他版本的编译器,往往由于版本更高,如需使用的寄存器更多,使得同学们乱用的寄存器也可以正常工作,这个就是弄巧成拙,当要求让大家使用masm5来编译程序,大家的程序漏洞就出现了。 强调一下,我们的汇编程序还没有复杂到需要很多辅助工具来设计完成,仅仅一个记事本,masm,link,debug就足够了,考试的使用,只承认在个条件下能正常工作的程序。 2.很多同学都偷懒使用16进制数作为输出,甚至输入,其实根本没有必要,因为短短的几行代码就可以完成这个转换工作,而且使用10进制,应该会更有利于编程。 3.输出有怪异的符号,例如笑脸,实际上,出现这个现象,也许说明你的程序基本接近尾声,注意在输出时是否为你要的数字加了30H以转换的ascii码。 4.输入的数据被下次的输入提示或者被输出结果覆盖,实际上这个也很好解决,成对的使用回车换行命令就可以了。 5.过分的浪费时间,计划就可以课堂完成的内容,有些同学就是要拖到课下,或者是在课下发奋完成,课堂上做其他事情,这样浪费的都是自己的宝贵时间,希望同学们能充分利用课堂的时间来完成作业,以减轻课下的负担。 返回首页
|