 |
Ассемблер в примерах - Выборка из набора данных
- Вопрос:
- В предвыборной кампании участвуют кандидаты в депутаты от различных партий. Запись для каждого кандидата содержит фамилию, имя, отчество, номер округа, партию, которую представляет кандидат, возраст, профессию. Вывести список кандидатов от определенной партии.
- Ответ:
-
model small ; модель памяти
.stack 100h
Party struc
party_ DB 30 dup (?)
nam DB 20 dup (?)
sur_name DB 20 dup (?)
pat_name DB 20 dup (?)
num_distr DB 5 dup (?)
age DB 5 dup (?)
profession DB 20 dup (?)
Party ends
.data
razmer dw 0
b dw ?
Mass Party <'Green apple ', 'Ivan ','Ivanov ','Ivanovych ',10,30,'Cleaner '>
Party <'Green apple ','Alexandr ','Rybak ','Petrovych ',5,23,'Singer '>
Party <'Green apple ', 'Pavel ','Pavlovych ','Pavlov ',1,90,'Househusband '>
Party <'KPU ', 'Petr ','Petrovych ','Petrov ',4,20, 'Ingener '>
Party <'Green apple ', 'Eduard ', 'Igorevych ','Sidorov ',3,35, 'Scientist '>
mes db 'Enter the name of the party you want to find: $', 13,10
mes2 db 'The list of this party is: $',13,10
mes3 db 'There are no deputys of this party! $',13, 10
dest db 80 dup (?)
.code
.startup
push ds
pop es
mov dx, 0
mov ah, 9
mov dx, offset mes
int 21h
mov ah, 3fh
mov bx, 0
mov cx, 80
mov dx, offset dest
int 21h
sub ax, 2 ;в ax длина строки плюс 0d0a
mov razmer, ax ; длина строки, которую ищем
mov ah, 9
mov dx, offset mes2
int 21h
cld
mov cx, 5
xor bp, bp ;признак, найдена ли партия
xor bx, bx
Loop0:
push cx
lea si, (Mass[bx]).party_ ;строка в массиве
lea di, dest ;введенная строка
mov cx, razmer ;длина введеной строки
repe cmpsb ;сравниваем, пока равно
jne next ; не равно - на следующую запись массива
cmp byte ptr [si], ' ' ; проверим, чтобы было ровно razmer символов!
jne next ;чтобы отсеять, например, KPUKR
;выведем поле sur_name
lea si, offset (Mass[bx]).sur_name
mov ah, 2 ;ф-я вывода символа
loop1:
mov dl, [si] ;очередной
inc si ; на следующий
int 21h
cmp dl, ' ' ;последний символ?
jne loop1 ;повторим для всей строки
inc bp ;взведем признак, что нашли
next: ;на следующую запись
pop cx
add bx, size Party
loop Loop0
test bp, bp ;проверим признак
jnz m3 ;если что-то нашли, то на выход
mov ah, 9
mov dx, offset mes3 ; ничего не нашли
int 21h
M3:
mov ah, 4ch
int 21h
end
|  |