Поиск в таблице - Assembler

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

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

Помогите с заданием Задание такое: Составьте программу, которая находит в таблице фамилии с температурой больше 38.5 и выводит на экран Таблица из 8 элементов вида 'Иванов','37.2'
Листинг программы
  1. model small
  2. stack 256
  3. .data
  4. namtab db 'Djelieva_S._G.____', '37.4'
  5. db 'Zinakov_A._B._____', '38.8'
  6. db 'Pestryakova_S._K._', '36.6'
  7. db 'Porunov_A._A._____', '37.7'
  8. db 'Konstantinov_N._E.', '36.7'
  9. db 'Kuchelev_D._A.____', '38.6'
  10. db 'Vostrikova_M._I.__', '39.2'
  11. db 'Makarov_R._A._____', '36.6'
  12. namepar label byte
  13. maxlen db 3
  14. actlen db ?
  15. alfnam db 19 dup('$')
  16. .code
  17. assume ds:@data, es:@data
  18. start:
  19. mov ax, @data
  20. mov ds, ax
  21. mov ax, 0600h
  22. mov bh, 07
  23. mov cx, 0000h
  24. mov dx, 184Fh
  25. int 10h
  26. mov ah, 02 ; запрос на установку курсора
  27. mov bh, 00 ; страница нулевая, относится к экрану
  28. mov dh, 01
  29. mov dl, 01
  30. int 10h
  31. A1:
  32. lea si, namtab
  33. mov cx, 8
  34. l1: add si, 18
  35. cmp [si], 3
  36. jge l2
  37. add si, 4
  38. jmp ll
  39. lc:
  40. add si, 3
  41. jmp ll
  42. lc2:
  43. add si, 1
  44. jmp ll
  45. ll:
  46. loop l1
  47. l2:
  48. inc si
  49. cmp [si], 8
  50. jb lc
  51. inc si
  52. inc si
  53. cmp [si], 5
  54. jle lc2
  55. sub si, 21
  56. lea di, alfnam
  57. mov cx, 18
  58. l4:
  59. mov al, [si]
  60. mov [di], al
  61. inc si
  62. inc di
  63. loop l4
  64. mov [di], 24h
  65. mov ah, 02 ; запрос на установку курсора
  66. mov bh, 00 ; страница нулевая, относится к экрану
  67. mov dh, 02
  68. mov dl, 01
  69. int 10h
  70. mov ah, 09h
  71. lea dx, alfnam
  72. int 21h
  73. mov ax, 4c00h
  74. int 21h
  75. end start
Сделал пока для одной фамилии, но почему то программа не прыгает на lc здесь
Листинг программы
  1. jb lc
, а идет дальше не пойму почему

Решение задачи: «Поиск в таблице»

textual
Листинг программы
  1. ;FASM-code.. (.model tiny)
  2. ;---------------------------
  3. org     100h
  4. jmp     start
  5.  
  6. mes0      db   13,10,'Temperature: $'
  7. mes1      db   13,10,'User.......: $'
  8. err       db   7,'No user!$'
  9.  
  10. namtab    db  'Djelieva S.G.    ', '37.4'
  11.           db  'Zinakov A.B.     ', '38.8'
  12.           db  'Pestryakova S.K. ', '36.6'
  13.           db  'Porunov A.A.     ', '37.7'
  14.           db  'Konstantinov N.E.', '36.7'
  15.           db  'Kuchelev D.A.    ', '38.6'
  16.           db  'Vostrikova M.I.  ', '39.2'
  17.           db  'Makarov R.A.     ', '36.9'
  18.  
  19. tabSize   =   8                 ; всего элементов в таблице
  20. user      =   17                ; макс.длина фамилии
  21. temp      =   4                 ; длина температуры
  22.  
  23. start:  mov   ah,9              ; запрос на ввод..
  24.         mov   dx,mes0           ;
  25.         int   21h               ;
  26.  
  27.         mov   cx,temp           ; символов для ввода
  28. @00:    mov   ah,1              ;
  29.         int   21h               ;
  30.         shrd  ebx,eax,8         ; собираем ввод в EBX (4 символа)
  31.         loop  @00               ;
  32.  
  33.         mov   ah,9              ; результ
  34.         mov   dx,mes1           ;
  35.         int   21h               ;
  36.  
  37. ;// Ищем EBX в таблице
  38.         mov   cx,tabSize        ; всего температур в таблице
  39.         mov   si,namtab         ; SI ставим на начало таблицы
  40.         add   si,user           ; смещаемся к температуре
  41. @01:    cmp   ebx,dword[si]     ; сравнить ввод с темп. в таблице
  42.         je    @okey             ; есть совпадение!
  43.         add   si,(user+temp)    ; иначе: сл.температура..
  44.         loop  @01               ;
  45.  
  46.         mov   ah,9              ; нет совпадений - ошибка!
  47.         mov   dx,err            ;
  48.         int   21h               ;
  49.         jmp   @exit             ;
  50.  
  51. ;// Выводим фамилию
  52. @okey:  mov   cx,user           ; символов для вывода
  53.         sub   si,cx             ; смещаемся в таблице к фамилии
  54. @name:  lodsb                   ; взать байт из DS:SI
  55.         int   29h               ; вывести его на консоль!
  56.         loop  @name             ;
  57.  
  58. @exit:  xor   ax,ax             ; ждём клаву
  59.         int   16h               ;
  60.         retn                    ; Bye!

Объяснение кода листинга программы

  1. Создание сообщений для вывода:
    • Temperature: $ = 13, 10, 'Temperature: $'
    • User.......: $ = 13, 10, 'User.......: $'
    • No user!$ = 7, 'No user!$'
  2. Создание таблицы с данными:
    • Djelieva S.G.     = 'Djelieva S.G.    ', '37.4'
    • Zinakov A.B.     = 'Zinakov A.B.     ', '38.8'
    • Pestryakova S.K. = 'Pestryakova S.K. ', '36.6'
    • Porunov A.A.     = 'Porunov A.A.     ', '37.7'
    • Konstantinov N.E. = 'Konstantinov N.E.', '36.7'
    • Kuchelev D.A.     = 'Kuchelev D.A.    ', '38.6'
    • Vostrikova M.I.   = 'Vostrikova M.I.  ', '39.2'
    • Makarov R.A.     = 'Makarov R.A.     ', '36.9'
  3. Установка значений переменных:
    • tabSize = 8 (количество элементов в таблице)
    • user = 17 (максимальная длина фамилии)
    • temp = 4 (длина температуры)
  4. Начало программы:
    • Переход к метке start
    • Описание вводимой температуры
    • Запрос ввода температуры
    • Сбор данных в EBX и вывод сообщения о вводе имени
  5. Поиск в таблице:
    • Поиск введенной температуры (EBX) в таблице
    • Вывод ошибки, если совпадений нет
  6. Вывод фамилии:
    • Вывод фамилии, соответствующей введенной температуре
  7. Завершение программы:
    • Ожидание нажатия клавиши
    • Возврат из программы

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


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

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

8   голосов , оценка 3.625 из 5

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

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

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