Поиск в таблице - 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) в таблице
- Вывод ошибки, если совпадений нет
- Вывод фамилии:
- Вывод фамилии, соответствующей введенной температуре
- Завершение программы:
- Ожидание нажатия клавиши
- Возврат из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д