实验五,六范例与讲评
在实验的过程中,如果大家都能按照提示,一步一步的完成小要求,可以轻松的写出这个程序,
下面是上一届同学写的程序与设计思想, 当然,程序在刚才的测试求和求平均中表现有些小异常,但是这已经不重要,因为只要算法和思路掌握了,进行相应的修改绝对不成问题。 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.过分的浪费时间,计划就可以课堂完成的内容,有些同学就是要拖到课下,或者是在课下发奋完成,课堂上做其他事情,这样浪费的都是自己的宝贵时间,希望同学们能充分利用课堂的时间来完成作业,以减轻课下的负担。 返回首页
|