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

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

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

Помогите с заданием Задание такое: Составьте программу, которая находит в таблице фамилии с температурой больше 38.5 и выводит на экран Таблица из 8 элементов вида 'Иванов','37.2'
 model small
    stack 256
.data
namtab db 'Djelieva_S._G.____', '37.4'
       db 'Zinakov_A._B._____', '38.8'
       db 'Pestryakova_S._K._', '36.6'
       db 'Porunov_A._A._____', '37.7'
       db 'Konstantinov_N._E.', '36.7'
       db 'Kuchelev_D._A.____', '38.6'
       db 'Vostrikova_M._I.__', '39.2'
       db 'Makarov_R._A._____', '36.6'
namepar label byte
maxlen db 3
actlen db ?
alfnam db 19 dup('$')
.code
assume ds:@data, es:@data
start:
    mov ax, @data
    mov ds, ax
 
        mov ax, 0600h
        mov bh, 07
        mov cx, 0000h
        mov dx, 184Fh
        int 10h
 
        mov ah, 02  ; запрос на установку курсора
        mov bh, 00  ; страница нулевая, относится к экрану
        mov dh, 01
        mov dl, 01
        int 10h
    
A1:
    lea si, namtab
    mov cx, 8
l1: add si, 18
    cmp [si], 3
    jge l2
    add si, 4
    jmp ll 
lc:
    add si, 3
    jmp ll
lc2:
    add si, 1
    jmp ll
ll: 
    loop l1
l2:
    inc si
    cmp [si], 8
    jb lc
    inc si
    inc si
    cmp [si], 5
    jle lc2
    sub si, 21
    lea di, alfnam
    mov cx, 18
l4: 
    mov al, [si]
    mov [di], al
    inc si
    inc di
    loop l4 
    mov [di], 24h
 
        mov ah, 02  ; запрос на установку курсора
        mov bh, 00  ; страница нулевая, относится к экрану
        mov dh, 02
        mov dl, 01
        int 10h 
    mov ah, 09h
    lea dx, alfnam
    int 21h
    
    mov ax, 4c00h
    int 21h
end start
Сделал пока для одной фамилии, но почему то программа не прыгает на lc здесь
jb lc
, а идет дальше не пойму почему

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

textual
Листинг программы
;FASM-code.. (.model tiny)
;---------------------------
org     100h
jmp     start
 
mes0      db   13,10,'Temperature: $'
mes1      db   13,10,'User.......: $'
err       db   7,'No user!$'
 
namtab    db  'Djelieva S.G.    ', '37.4'
          db  'Zinakov A.B.     ', '38.8'
          db  'Pestryakova S.K. ', '36.6'
          db  'Porunov A.A.     ', '37.7'
          db  'Konstantinov N.E.', '36.7'
          db  'Kuchelev D.A.    ', '38.6'
          db  'Vostrikova M.I.  ', '39.2'
          db  'Makarov R.A.     ', '36.9'
 
tabSize   =   8                 ; всего элементов в таблице
user      =   17                ; макс.длина фамилии
temp      =   4                 ; длина температуры
 
start:  mov   ah,9              ; запрос на ввод..
        mov   dx,mes0           ;
        int   21h               ;
 
        mov   cx,temp           ; символов для ввода
@00:    mov   ah,1              ;
        int   21h               ;
        shrd  ebx,eax,8         ; собираем ввод в EBX (4 символа)
        loop  @00               ;
 
        mov   ah,9              ; результ
        mov   dx,mes1           ;
        int   21h               ;
 
;// Ищем EBX в таблице
        mov   cx,tabSize        ; всего температур в таблице
        mov   si,namtab         ; SI ставим на начало таблицы
        add   si,user           ; смещаемся к температуре
@01:    cmp   ebx,dword[si]     ; сравнить ввод с темп. в таблице
        je    @okey             ; есть совпадение!
        add   si,(user+temp)    ; иначе: сл.температура..
        loop  @01               ;
 
        mov   ah,9              ; нет совпадений - ошибка!
        mov   dx,err            ;
        int   21h               ;
        jmp   @exit             ;
 
;// Выводим фамилию
@okey:  mov   cx,user           ; символов для вывода
        sub   si,cx             ; смещаемся в таблице к фамилии
@name:  lodsb                   ; взать байт из DS:SI
        int   29h               ; вывести его на консоль!
        loop  @name             ;
 
@exit:  xor   ax,ax             ; ждём клаву
        int   16h               ;
        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
Похожие ответы