Поиск в таблице - Assembler
Формулировка задачи:
Помогите с заданием
Задание такое:
Составьте программу, которая находит в таблице фамилии с температурой больше 38.5 и выводит на экран
Таблица из 8 элементов вида 'Иванов','37.2'
Сделал пока для одной фамилии, но почему то программа не прыгает на lc здесь
, а идет дальше не пойму почему
Листинг программы
- 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
Листинг программы
- 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!
Объяснение кода листинга программы
- Создание сообщений для вывода:
Temperature: $
= 13, 10, 'Temperature: $'User.......: $
= 13, 10, 'User.......: $'No user!$
= 7, 'No user!$'
- Создание таблицы с данными:
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'
- Установка значений переменных:
tabSize
= 8 (количество элементов в таблице)user
= 17 (максимальная длина фамилии)temp
= 4 (длина температуры)
- Начало программы:
- Переход к метке
start
- Описание вводимой температуры
- Запрос ввода температуры
- Сбор данных в EBX и вывод сообщения о вводе имени
- Переход к метке
- Поиск в таблице:
- Поиск введенной температуры (EBX) в таблице
- Вывод ошибки, если совпадений нет
- Вывод фамилии:
- Вывод фамилии, соответствующей введенной температуре
- Завершение программы:
- Ожидание нажатия клавиши
- Возврат из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д