实验五,六范例与讲评

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

返回首页