作者:牧羊座 此贴贴于2012-5-2 20:17:14,已被阅读298次/回复0 
求高手帮忙指出问题,真的狠感谢啊,还赶时间、、
代码目的:求两个两位数相乘并显示结果
不用子程序时正常,用子程序时运行有问题,大体一样,我把调用子程序的命令直接换成子程序中的代码就正常,但是用子程序调用就有问题,我已经尽了力改了又改,求高人帮忙指出问题啊

不用子程序调用:
DATA SEGMENT
KEY1  DB 'input the first number: $'
KEY2  DB 'input the second number: $'
KEY3  DB 'the result: $'
  X1  DB 0
  X2  DB 0
  C1  DW ?
  D1  DB '      $'
DATA ENDS
STAK SEGMENT STACK
    DW 100 DUP(?)
STAK ENDS
CODE SEGMENT
    ASSUME CS:CODE, DS:DATA, SS:STAK
START:MOV   AX,DATA
      MOV   DS,AX
      LEA   DX,KEY1
      MOV   AH,9
      INT  21H
          
     MOV   CX,2                      ;调用子1
TA:  MOV   AH,1
     INT  21H
     DEC   CX
     SUB   AL,30H
     CMP   CX,0
     JE   TB
     MOV   BL,10
     MUL   BL
TB:  ADD   X1,AL
     CMP   CX,1
     JE   TA                         ;
        
      MOV   AL,X1                    ;转移X1到X2
      MOV   X2,AL 
      MOV   X1,0   
      MOV   DX,0AH                   ;换行回车
      MOV   AH,2
      INT  21H
      MOV   DX,0DH
      MOV   AH,2
      INT  21H    
      LEA   DX,KEY2                  
      MOV   AH,9
      INT  21H
         
     MOV   CX,2                     ;调用子1
TE:  MOV   AH,1
     INT  21H
     DEC   CX
     SUB   AL,30H
     CMP   CX,0
     JE   TD
     MOV   BL,10
     MUL   BL
TD:  ADD   X1,AL
     CMP   CX,1
     JE   TE                       ;
   
      MOV   AL,X1                    ;两数相乘,乘积存到C1
      MUL   X2 
      MOV   C1,AX 
       
     MOV   AX,C1                     ;调用子2
     MOV   BX,10
     LEA   SI, D1+4                ;从串尾开始存数
TC:  XOR   DX,DX 
     DIV   BX
     ADD   DL,30H
     MOV   [SI],DL
     DEC   SI
     CMP   AX,0
     JZ   TO
     JMP  TC                         ;
    
TO:   MOV   DX,0AH                   ;换行回车
      MOV   AH,2
      INT  21H
      MOV   DX,0DH
      MOV   AH,2
      INT  21H    
      LEA   DX,KEY3           
      MOV   AH,9
      INT  21H
      LEA   DX,D1
      MOV   AH,9
      INT  21H    
      MOV   AH,4CH
      INT  21H
CODE ENDS
      END  START

用子程序:
INANUM PROC 
     PUSH  AX
     PUSH  BX
     PUSH  CX   
     MOV   CX,2                     ;调用子1
TE:  MOV   AH,1
     INT  21H
     DEC   CX
     SUB   AL,30H
     CMP   CX,0
     JE   TD
     MOV   BL,10
     MUL   BL
TD:  ADD   X1,AL
     CMP   CX,1
     JE   TE        
     POP   CX
     POP   BX
     POP   AX
     RET
INANUM ENDP
BINASC PROC 
     PUSH  AX
     PUSH  BX
     PUSH  DX
     PUSH  SI
     MOV   AX,C1
     MOV   BX,10H
     LEA   SI, D1+4                ;从串尾开始存数
TC:  XOR   DX,DX 
     DIV   BX
     ADD   DL,30H
     MOV   [SI],DL
     DEC   SI
     CMP   AX,0
     JZ   TO
     JMP  TC
TO:  POP   SI
     POP   DX
     POP   BX
     POP   AX
     RET
BINASC ENDP           
DATA SEGMENT
KEY1  DB 'input the first number: $'
KEY2  DB 'input the second number: $'
KEY3  DB 'the result: $'
  X1  DB ?
  X2  DB ?
  C1  DW ?
  D1  DB '      $'
DATA ENDS
STAK SEGMENT STACK
    DW 100 DUP(?)
STAK ENDS
CODE SEGMENT
    ASSUME CS:CODE, DS:DATA, SS:STAK
START:MOV   AX,DATA
      MOV   DS,AX
      LEA   DX,KEY1
      MOV   AH,9
      INT  21H
      CALL  INANUM
      MOV   AL,X1                    ;转移X1到X2
      MOV   X2,AL  
      MOV   X1,0  
      MOV   DX,0AH                   ;换行回车
      MOV   AH,2
      INT  21H
      MOV   DX,0DH
      MOV   AH,2
      INT  21H    
      LEA   DX,KEY2                  
      MOV   AH,9
      INT  21H
      CALL  INANUM   
      MOV   AL,X1                    ;两数相乘,乘积存到C1
      MUL   X2 
      MOV   C1,AX  
      CALL  BINASC
      LEA   DX,KEY3           
      MOV   AH,9
      INT  21H
      LEA   DX,D1
      MOV   AH,9
      INT  21H
      MOV   AH,4CH
      INT  21H
CODE ENDS
      END  START
       


手拉手,一起去地狱、、