Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Выборка из набора данных

Вопрос:
В предвыборной кампании участвуют кандидаты в депутаты от различных партий. Запись для каждого кандидата содержит фамилию, имя, отчество, номер округа, партию, которую представляет кандидат, возраст, профессию. Вывести список кандидатов от определенной партии.

Ответ:
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

   Вперёд
   Содержание