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