Организация ввода пользователем заданного числа элементов массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Задача: перегруппировать элементы целочисленного массива: чтобы сначала шли отрицательные, потом нулевые, потом положительные элементы (порядок следования в каждой группе сохранить). Задачу реализовала, но у меня изначально вводилось 10 элементов, пытаюсь переделать , чтобы сначала вводили необходимое число элементов, а потом ввод и когда отображается строка "результат" появляются страшная музыка и крокозябры...уже не знаю что и делать
Листинг программы
  1. EXTRN Cursor:Far,Clear:Far,Write_Str:Far,Vvod:Far,Vyvod:Far
  2. ;------------------ Сегмент стека -------------------------
  3. Stacksg SEGMENT PARA STACK
  4. DW 128 DUP(?)
  5. Stacksg ENDS
  6. ;--------------------- Сегмент данных---------------------
  7. Datasg SEGMENT PARA
  8. STR1 DB "количество: $"
  9. STR2 DB "Последовательность: $"
  10. STR3 DB "Результат: $"
  11. count DW 0
  12. X DW 0
  13. MPOL DW 20 DUP(?)
  14. MOTR DW 20 DUP(?)
  15. MNUL DW 20 DUP(?)
  16. KP DW 0
  17. KO DW 0
  18. KN DW 0
  19. MAS DW 20 DUP(?)
  20. Datasg ENDS
  21. ;---------------------Кодовый сегмент --------------------
  22. Codesg SEGMENT PARA
  23. begin PROC FAR
  24. ;Пролог EXE-программы.
  25. ;Выполнение первого требования.
  26. ASSUME CS:Codesg, DS:Datasg, SS:Stacksg
  27. ;Выполнение второго требования.
  28. PUSH DS ; Записать DS в стек.
  29. ;Выполнение третьего требования.
  30. XOR AX,AX ; Установить в нуль AX.
  31. PUSH AX ; Записать AX в стек.
  32. ;Выполнение четвертого требования.
  33. MOV AX,Datasg ; Занести адрес
  34. MOV DS,AX ; Datasg в DS.
  35. ;Завершение пролога EXE-программы.
  36. CALL Clear
  37. MOV DX,0000H
  38. CALL Cursor
  39. Lea dx,STR1 ; вводим количество
  40. call Write_Str
  41. mov dx, 0013H
  42. call Cursor
  43. call Vvod
  44. mov count,bx
  45. MOV DX,0200H
  46. CALL Cursor
  47. LEA DX,STR2 ;Загрузка адреса сообщения.
  48. CALL Write_Str
  49. MOV DX,0212H
  50. LEA SI,MAS
  51. MOV CX,count
  52. BEG2:
  53. ADD DX,3 ; ввод массива
  54. CALL Cursor
  55. CALL Vvod
  56. MOV [SI],BX
  57. ADD SI,2
  58. LOOP BEG2
  59. MOV DX,0300H
  60. CALL Cursor
  61.  
  62. LEA DX,STR3 ;Загрузка адреса сообщения.
  63. CALL Write_Str
  64. LEA SI,MAS
  65. MOV CX,count
  66. BEG1:
  67. MOV AX,[SI]
  68. CMP AX,0
  69. JL OTR ; если меньше 0
  70. JE NU ; если равно
  71. LEA BX,MPOL ; заполнение массива полож
  72. mov ax,kp ; кол-во полож
  73. MOV DX, 2
  74. MUL DX
  75. add bx,ax
  76. MOV DX,[SI]
  77. MOV [BX],DX
  78. INC KP
  79. JMP A2
  80. OTR: ;заполнение массива отриц
  81. LEA BX,MOTR
  82. mov ax,ko
  83. MOV DX, 2
  84. MUL DX
  85. add bx,ax
  86. MOV DX,[SI]
  87. MOV [BX],DX
  88. INC KO
  89. JMP A2
  90. NU: ; заполнение массива нулей
  91. LEA BX,MNUL
  92. mov ax,kn
  93. MOV DX, 2
  94. MUL DX
  95. add bx,ax
  96. MOV DX,[SI]
  97. MOV [BX],DX
  98. INC KN
  99. A2:
  100. ADD SI,2 ; смещение на след эл-т
  101. LOOP BEG1
  102. ;записываем обратно в массив
  103. LEA SI,MAS
  104. LEA BX,MOTR
  105. MOV AX,KO
  106. JE BEG22 ; если нет отриц то переходи к 0
  107. MOV CX,KO
  108. BEG21:
  109. MOV AX,[BX]
  110. MOV [SI],AX
  111. ADD SI,2
  112. ADD BX,2
  113. LOOP BEG21
  114. BEG22:
  115. LEA BX,MNUL
  116. MOV AX,KN
  117. JE BEG33
  118. MOV CX,KN
  119. BEG3:
  120. MOV AX,[BX]
  121. MOV [SI],AX
  122. ADD SI,2
  123. ADD BX,2
  124. LOOP BEG3
  125. BEG33:
  126. LEA BX,MPOL
  127. MOV AX,KP
  128. JE BEG44
  129. MOV CX,KP
  130. BEG4:
  131. MOV AX,[BX]
  132. MOV [SI],AX
  133. ADD SI,2
  134. ADD BX,2
  135. LOOP BEG4
  136. mov dx,0400H
  137. call Cursor
  138. LEA SI,MAS
  139. MOV CX,count
  140. BEG44: ; вывод массива
  141. MOV BX,[SI]
  142. ADD DX,3
  143. CALL Cursor
  144. CALL Vyvod
  145. ADD SI,2
  146. loop BEG44
  147.  
  148. begin ENDP
  149. Codesg ENDS
  150. END begin

Решение задачи: «Организация ввода пользователем заданного числа элементов массива»

textual
Листинг программы
  1. ; Fasm code........
  2. org 100h
  3. jmp start
  4.  
  5. mes0    db    13,10,' Кол-во элементов: $'
  6. mes1    db    13,10,' Введите массив..: $'
  7. mes2    db    13,10,' Результат.......: $'
  8.  
  9. buff    db    80 dup(0)             ; буфера
  10. mOtr    db    32 dup('*')           ;
  11. mNul    db    32 dup('*')           ;
  12. mPol    db    32 dup('*')           ;
  13. count   dw    0                     ; длина массива
  14. flag    db    0                     ; флаг отрицательных
  15.  
  16. start:  mov   dx,mes0               ;
  17.         call  Message               ;
  18.         call  asc2hex               ; принимаем кол-во с клавы
  19.         mov   [count],di            ; запомним..
  20.  
  21. ;--- Заполняем массив указанным кол-вом элементов --------------------//
  22.         mov   dx,mes1               ;
  23.         call  Message               ;
  24.         mov   cx,di                 ; кол-во чисел для ввода
  25.         mov   si,buff               ; куда сохранять
  26. createArray:                        ;
  27.         call  asc2hex               ; принимаем очередное число..
  28.         int   29h                   ; вставляем запятую/разделитель
  29.         xchg  ax,di                 ;
  30.         mov   byte[si],al           ; сохраняем по-адресу SI
  31.         inc   si                    ; шаг вперёд в буфере
  32.         loop  createArray           ; мотаем цикл СХ-раз..
  33.  
  34. ;--- Сортируем данные по-буферам -------------------------------------//
  35.         mov   cx,[count]            ; длина массива
  36.         mov   si,buff               ; источник данных
  37.         mov   di,mOtr               ; адреса приёмников
  38.         mov   bx,mNul               ; ^
  39.         mov   bp,mPol               ; ^
  40. cycle:  lodsb                       ; берём байт из SI
  41.         or    al,al                 ; взводим флаги!
  42.         jns   null                  ; прыг, если SF=0 (число не отрицательное)
  43.         mov   byte[di],al           ; иначе: отправляем байт по-адресу(di)
  44.         inc   di                    ; смещаемся в буфере
  45.         jmp   sort                  ; продолжить цикл..
  46. null:   jnz   nzero                 ; прыг, если ZF=0 (число не является нулём)
  47.         mov   byte[bx],al           ;
  48.         inc   bx                    ;
  49.         jmp   sort                  ;
  50. nzero:  mov   byte[bp],al           ; значит положительное!
  51.         inc   bp                    ;
  52. sort:   loop  cycle                 ; мотаем цикл СХ-раз..
  53.  
  54. ;--- Выводим отсортированные данные на экран -------------------------//
  55.         mov   dx,mes2               ;
  56.         call  Message               ;
  57.         xor   ax,ax                 ;
  58.         mov   si,mOtr      ;<-------; сначала отрицательные!
  59. prn1:   lodsb                       ;
  60.         cmp   al,'*'                ; пока не встретится маркер конца
  61.         je    prn2                  ;
  62.         neg   al                    ; инверсия отриц.числа для вывода
  63.         push  ax                    ;
  64.         mov   al,'-'                ; вставляем знак
  65.         int   29h                   ;
  66.         pop   ax                    ;
  67.         call  hex2asc               ; выводим очередное число на экран
  68.         mov   al,','                ; вставляем разделитель чисел
  69.         int   29h                   ;
  70.         jmp   prn1                  ; на повтор..
  71.  
  72. prn2:   xor   ax,ax         ;<------; теперь нули!
  73.         mov   si,mNul               ;
  74. @mNul:  lodsb                       ;
  75.         cmp   al,'*'                ;
  76.         je    prn3                  ;
  77.         call  hex2asc               ;
  78.         mov   al,','                ;
  79.         int   29h                   ;
  80.         jmp   @mNul                 ;
  81.  
  82. prn3:   xor   ax,ax         ;<------; в конце положительные!
  83.         mov   si,mPol               ;
  84. @mPol:  lodsb                       ;
  85.         cmp   al,'*'                ;
  86.         je    exit                  ;
  87.         call  hex2asc               ;
  88.         mov   al,','                ;
  89.         int   29h                   ;
  90.         jmp   @mPol                 ;
  91.  
  92. exit:   xor   ax,ax                 ; ждём клавишу..
  93.         int   16h                   ;
  94.         int   20h                   ; на выход!
  95.  
  96. ;ннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннннн
  97. Message:                            ;
  98.         mov   ah,9                  ;
  99.         int   21h                   ;
  100.         ret                         ;
  101. ;----------------------------------------------------------------------
  102. ; Ввод чисел с клавиатуры.
  103. ; На выходе получаем 10-тичное число в DI. Есть проверка на знак.
  104. ; Заканчивает ввод по двум клавишам: 'Enter' и ',' (запятая).
  105. ; Enter заканчивает ввод длины массива, Запятая - ввод чисел в массив.
  106. asc2hex:                            ;
  107.         push  si                    ;
  108.         mov   [flag],0              ; очищаем флаг отрицательных
  109.         xor   di,di                 ;
  110.         mov   si,10                 ; множитель для системы счисления
  111. @@1:    xor   ax,ax                 ; ждём клавишу..
  112.         int   16h                   ;
  113.         cmp   al,'-'                ; если минус,
  114.         jne   @@2                   ;
  115.         int   29h                   ;   ..то выводим его,
  116.         inc   [flag]                ;      ..устанавливаем флаг
  117.         jmp   @@1                   ;          ..и читаем сл.клавишу
  118. @@2:    cmp   al,13                 ; Enter?
  119.         je    stop                  ;
  120.         cmp   al,','                ; разделитель?
  121.         je    stop                  ;
  122.         cmp   al,'0'                ; игнорируем буквы
  123.         jb    @@1                   ;
  124.         cmp   al,'9'                ;
  125.         ja    @@1                   ;
  126.         int   29h                   ; покажем ввод
  127.         and   ax,0fh                ;
  128.         xchg  di,ax                 ;
  129.         xor   dx,dx                 ;
  130.         mul   si                    ;
  131.         add   di,ax                 ; и сохраняем число в DI
  132.         jmp   @@1                   ; сл.разряд числа..
  133.                                     ; юзер прекратил ввод!
  134. stop:   cmp   [flag],0              ; проверим на отрицательное
  135.         je    okey                  ;
  136.         neg   di                    ; инверсия (если нужно)
  137. okey:   pop   si                    ;
  138.         ret                         ; выходим из процедуры ввода!
  139.  
  140. ;---------------------------------------------------------------------------
  141. hex2asc:                            ; Функция переводит числа в символы
  142.         pusha                       ; Вход:  АХ = число, BX = система счисления
  143.         xor   cx,cx                 ; Выход: на экране
  144.         mov   bx,10                 ;
  145. isDiv:  xor   dx,dx                 ;
  146.         div   bx                    ;
  147.         push  dx                    ;
  148.         inc   cx                    ;
  149.         or    ax,ax                 ;
  150.         jnz   isDiv                 ;
  151. isOut:  pop   ax                    ;
  152.         add   al,30h                ;
  153.         int   29h                   ;
  154.         loop  isOut                 ;
  155.         popa                        ;
  156.         ret                         ;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.615 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы