Ошибка в интерфейсе-HELP

Тема в разделе "WASM.BEGINNERS", создана пользователем winnix, 10 янв 2009.

  1. winnix

    winnix New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    22
    Здравствуйте!

    Вот написал программу обработки массива с интерфейсом.Что то напутал с выводом...или с вводом...Искал но не смог найти ошибки.
    Выводит нули почему то...в массов вроде правильно записываю...
    Код (Text):
    1. NAME SORT
    2.  
    3.     ALPHALEN EQU 10
    4.     MAXMASLEN   EQU 100
    5.     STLEN    EQU 5 
    6.  
    7. DATA SEGMENT
    8.     MAS1 DW MAXMASLEN DUP(?)
    9.  
    10.     MAS2 DW MAXMASLEN DUP(?)
    11.  
    12.     FL DB 0
    13.  
    14.     ALPHA DB '0123456789'  
    15.     EMPTY DB 0AH,0DH,'$'
    16.     hello       db 'VAS PRIVETSTVUET PROGARAMMA DLYA SORTIROVKI DVUH MASSIVOV',0Ah,0Dh
    17.                 db 'MAX KOLICHESTVO IMEN V MASSIVE = 100',0Ah,0Dh
    18.                 db 'DLYA VIHODA IZ CIKLICHESKOGO VVODA NAGMITE 2RAZA ENTER',0Ah,0Dh,'$'
    19.  
    20.     wait_mes  db 0Ah,0Dh,'DLYA PRODOLGENIYA NAGMITE ENTER....',0Ah,0Dh,'$'
    21.     entr_mes1 db 'VVEDITE CHEREZ ENTER IMENA DLYA PERVOGO MASSIVA:',0Ah,0Dh,'$'
    22.     ERR_MES DB 'INVALID DATA',0AH,0DH,'$'
    23.  
    24.     warn_mes  db 'VI NICHEGO NE VVELI',0Ah,0Dh,'$'
    25.     out_mes   db 0Ah,0Dh,'DLYA VIHODA NGMITE ENTER',0Ah,0Dh,'$'
    26.  
    27.     TEMPSTR DB 6 DUP(?),'$'
    28.  
    29.     PARAMETERS LABEL BYTE
    30.     MAXLEN DB 6
    31.     ACTLEN DB ?
    32.     ENTNAME DB 5 DUP(?),'$'
    33.  
    34.     COUNT1 dw ?
    35.     COUNT DW ?
    36.  
    37. DATA ENDS
    38.  
    39. STACK SEGMENT STACK
    40.       DW 16 DUP(?)
    41.  STKTOP LABEL WORD
    42. STACK ENDS
    43.  
    44. CODE SEGMENT
    45.           ASSUME CS:CODE,DS:DATA,SS:STACK
    46.  
    47. ;===ПОДПРОГРАММА ВВОДА
    48. INTERF PROC  
    49.  
    50.               MOV BP,SP
    51.        
    52.  
    53.                         ;cx=0 - нуль элементов введено
    54.                          ;сохраняем счетчик элементов
    55.    ;циклический ввод имен          
    56. ADDLOOP:    
    57.    ;блок ввода          
    58.               MOV AH,0AH          ;запрашиваем ввод имени
    59.               LEA DX,PARAMETERS
    60.               INT 21H
    61.    ;блок проверки 1
    62.  
    63.  
    64.               LEA SI,entname                    
    65.    ;блок проверки 2 (запрещенные символы)          
    66.               XOR CH,CH            
    67.               MOV CL,actlen      ;расширяем до слова ACTLEN
    68. check_1:      CMP CX,0        ;если CX=0 проверка прошла успешно
    69.         JE check_2
    70.               LEA DI,ALPHA       ;загружаем в DI алфавит английских букв
    71.               PUSH CX            ;сохраняем счетчик длины имени
    72.               MOV CX,ALPHALEN    ;счетчик на длину англ алфавита
    73.               MOV AL,[SI]        ;извлекаем букву имени на проверку
    74.         m1:   CMP AL,[DI]        ;начинаем сравнивать
    75.               JE continue_m      ;переходим на след.букву
    76.               INC DI
    77.               LOOP m1
    78.               POP CX             ;чтобы не искажать стэк извлекаем CX
    79.               JMP vvod_err      
    80. continue_m:   INC SI             ;буква нашлась - модифицируем счетчики
    81.               POP CX
    82.               DEC CX
    83.               JMP check_1
    84.  
    85. check_2:      MOV AL,ACTLEN
    86.           CMP ACTLEN,5
    87.               JB MAKE_ELEMENT
    88.           LEA SI,ENTNAME
    89.           MOV AH,36H
    90.               CMP [SI],AH
    91.               JB MAKE_ELEMENT
    92.         JE CHECK_3
    93.         JMP VVOD_ERR
    94. CHECK_3:    MOV AH,35H
    95.         CMP [SI+1],AH
    96.         JB MAKE_ELEMENT
    97.         JE CHECK_4
    98.         JMP VVOD_ERR
    99. CHECK_4:    MOV AH,35H
    100.         CMP [SI+2],AH
    101.         JB MAKE_ELEMENT
    102.         JE CHECK_5
    103.         JMP VVOD_ERR
    104. CHECK_5:    MOV AH,33H
    105.         CMP [SI+3],AH
    106.         JB MAKE_ELEMENT
    107.         JE CHECK_6
    108.         JMP VVOD_ERR
    109. CHECK_6:    MOV AH,35H
    110.         CMP [SI+4],AH
    111.         JBE MAKE_ELEMENT
    112.         JA VVOD_ERR
    113.        
    114.  
    115. MAKE_ELEMENT:  
    116.         MOV AL,ACTLEN          ;досрочный выход из цикла ввода
    117.         XOR AH,AH
    118.         ADD AH,AL
    119.               CMP AH,0
    120.               JE end_ent         ;если да то заканчиваем выполнение
    121.  
    122.  
    123.         LEA DI,[BP+4]
    124.         LEA SI,ENTNAME
    125.         XOR BX,BX
    126.         XOR AX,AX
    127.         MOV CH,0
    128.         MOV CL,ACTLEN-1
    129. MOD1:       MOV AL,[SI]
    130.         SUB AX,30H
    131.         ADD BX,AX
    132.         SHL BX,1
    133.        
    134.         MOV AX,BX
    135.         ADD BX,AX
    136.         ADD BX,AX
    137.         ADD BX,AX
    138.         ADD BX,AX
    139.         ADD BX,AX
    140.  
    141.         INC SI
    142.         LOOP MOD1
    143.         MOV AL,[SI]
    144.         SUB AL,30H
    145.         ADD BX,AX
    146.         MOV [DI],BX
    147.         ADD DI,TYPE MAS1
    148.         MOV AX,COUNT
    149.         INC AX
    150.         MOV COUNT,AX
    151.  
    152.         MOV AH,09H
    153.             LEA DX,empty      ;перевод курсора на след строку
    154.         INT 21H
    155.        
    156.         MOV AX,COUNT
    157.               CMP AX,MAXMASLEN    ;смотрим достиги предела ввода
    158.               JE end_ent        ;если да то завершаем программу
    159.               JMP addloop       ;если нет продолжаем циклический ввод
    160.    ;блок сообщения об ошибке ввода          
    161.     vvod_err: MOV AH,09H
    162.               LEA DX,ERR_MES
    163.               INT 21H
    164.               JMP ADDLOOP
    165.    ;блок завершения подпрограммы          
    166.     end_ent:       ;значение количества введенных имен
    167.              
    168.               RET 4
    169. INTERF ENDP
    170.  
    171.  
    172. ;===ПОДПРОГРАММА ВЫВОДА МАССИВА
    173.  
    174. INTERFV PROC  
    175.              
    176.               MOV BP,SP
    177.               MOV DI,[BP+2]
    178.               MOV CX,[BP+4]
    179.               CMP CX,0
    180.               JE warning
    181.  
    182. M7:    
    183.  
    184.         MOV AX,[DI]
    185.         MOV BX,10
    186.         LEA SI,TEMPSTR+5
    187.  
    188. M8:     XOR DX,DX
    189.         DIV BX
    190.         OR DX,30H
    191.         MOV [SI],DL
    192.         CMP AX,10
    193.         JB COMPLETE
    194.         DEC SI
    195.         JMP M8
    196. COMPLETE:  
    197.        
    198.         MOV AH,09H
    199.         LEA DX,TEMPSTR
    200.         INT 21H
    201.        
    202.         MOV AH,09H
    203.             LEA DX,empty      ;перевод курсора на след строку
    204.         INT 21H
    205.         ADD DI,TYPE MAS1
    206.  
    207.         LEA SI,TEMPSTR
    208.         MOV BX,3030H
    209.         MOV WORD PTR [SI],BX
    210.         MOV WORD PTR [SI+2],BX
    211.         MOV WORD PTR [SI+4],BX
    212.  
    213.         LOOP M7
    214.         JMP END_PROC
    215.  
    216.     warning:  MOV AH,09H
    217.               LEA DX,warn_mes
    218.               INT 21H
    219.   end_proc:  
    220.               RET 2
    221. INTERFV ENDP
    222.  
    223.  
    224. SORTMAS MACRO MAS,maslen
    225.       LOCAL INT,EX,LESS
    226. INT: LEA SI,MAS
    227.      MOV FL,0
    228.      MOV CX,MASLEN-1
    229. EX:  MOV AX,[SI+2]
    230.      CMP [SI],AX
    231.      JB LESS
    232.      MOV DX,[SI]
    233.      MOV AX,[SI+2]
    234.      MOV [SI],AX
    235.      MOV [SI+2],DX
    236.      MOV FL,1
    237. LESS:ADD SI,TYPE MAS
    238.      LOOP EX
    239.      CMP FL,1
    240.      JE INT
    241. ENDM
    242.  
    243. START: MOV AX,DATA
    244.        MOV DS,AX
    245.        MOV AX,STACK
    246.        MOV SS,AX
    247.        LEA SP,STKTOP
    248.  
    249.             ;вывод сообщения приветствия
    250.        MOV AH,09H
    251.        LEA DX,hello
    252.        INT 21H
    253.             ;вывод сообщения нажатия Enter
    254.        MOV AH,09H
    255.        LEA DX,wait_mes
    256.        INT 21H
    257.        MOV AH,0Ah
    258.        INT 21H
    259.             ;Приглашение ввести элементы первого списка
    260.        MOV AH,09H
    261.        LEA DX,entr_mes1
    262.        INT 21H
    263.             ;Вызов подпрограммы ввода
    264.        
    265.     LEA DI,MAS1
    266.     PUSH DI
    267.     LEA SI,COUNT1
    268.     PUSH SI
    269.        CALL INTERF
    270.     MOV AX,COUNT
    271.     MOV COUNT1,AX
    272.    
    273.     SORTMAS MAS1,COUNT1;при сортировке пишет ошибку разрядности
    274.  
    275.            ;вызов подпрограммы вывода
    276.        PUSH COUNT1
    277.        LEA SI,MAS1
    278.        PUSH SI
    279.        CALL INTERFV
    280.  
    281.            ;Сообщение о выходе по нажатию Enter
    282.        MOV AH,09H
    283.        LEA DX,out_mes
    284.        INT 21H
    285.        MOV AH,0Ah
    286.        INT 21H
    287.        ;Выход
    288.        MOV AX,4C00H
    289.        INT 21H
    290.  
    291.  
    292.  
    293. CODE ENDS
    294.      END START
    Помогите пожалуйста.Сам не могу понять...
    При сортировке выдает ошибку разрядности,как решить еще и эту проблему?

    Заранее спасибо.