Структура: Необходимо организовать ввод данных в массив структур и поиск записи по имени. - Assembler
Формулировка задачи:
Мне необходимо организовать ввод данных в массив структур и поиск записи по имени.
Проблема заключается в том, что я не совсем понимаю как работать с этим массивом.
Для начала я пытался просто вывести 1 имя, и на выходе получил какой-то мусор
;pril_8.asm
.286
;MASM
.MODEL small
.STACK 100h
worker struc
nam db 20 dup (' ')
age db 3 dup (' ')
len dw 0
worker ends
.data
mas worker 10 DUP (<>)
rec worker <>
i db 0
msgNameInput db 10,13,"Input name : $";
msgCountInput db 10,13,"Input count: $"
msgAgeInput db 10,13,"Input age: $"
nextRow db 10,13,'$'
inpstr db 20 dup('$')
index dw 0
.code
assume ds:@data,es:@data
inputString proc
lea dx,nextRow
mov ah,09h
int 21h
lea dx,msgNameInput
mov ah,09h
int 21h
mov bl,0
mov si,0
while2:
mov ah,01h
mov al,00h
int 21h
cmp al,0Dh
je break1
mov [rec].nam+si, al
inc si
jmp while2
mov inpstr+si,'$'
break1:
lea di,rec
mov [di].len,si
ret
endp
inputAge proc
lea dx,msgAgeInput
mov ah,09h
int 21h
mov ah,01h
mov al,00h
int 21h
mov [di].age, al
mov ah,01h
mov al,00h
int 21h
mov [di].age+1, al
ret
endp
main:
push @data
pop ds
lea dx, msgCountInput
mov ah,09h
int 21h
mov ah,01h
mov al,00h
int 21h
sub al,30h
mov ah,0
mov cx,ax
mov bx, type worker
lea di,mas
do:
call InputString
mov si,0
call InputAge
add di, bx
inc index
loop do
mov cx,index
dec cx
sub di, bx
lea dx,nextRow
mov ah,09h
int 21h
lea dx,[di].nam
mov ah,09h
int 21h
mov ax,4c00h
int 21h
end mainРешение задачи: «Структура: Необходимо организовать ввод данных в массив структур и поиск записи по имени.»
textual
Листинг программы
model tiny .code org 100h szName equ 20 worker struc nxt dw ? nam db szName dup(?) age dw ? worker ends szWorker =szName + 4 begin: xor ax,ax lea si,arrayWorker mov [si].nxt,ax Menu: mov ah,9 lea dx,dbMenu int 21h xor ax,ax int 16h and ax,0Fh cmp al,3 ja Menu shl ax,1 lea bx,dwMenu add bx,ax call [bx] jmp Menu dbMenu db 10,13,13,'1-Add new Worker;' db 10,13,'2-Show all worker;' db 10,13,'3-Find worker;' db 10,13,'4-Save data;' db 10,13,'5-Load data;' db 10,13,'0-Exit.$' dwMenu dw offset ExitWorker;0 dw offset ReadWorker;1 dw offset ShowWorker;2 dw offset FindWorker;3 dw offset SaveWorker;4 dw offset LoadWorker;5 ExitWorker proc pop ax ret ExitWorker endp ReadWorker proc lea si,arrayWorker RW1: mov ax,[si].nxt or ax,ax jz RW2 mov si,[si].nxt jmp short RW1 RW2: mov ah,9 lea dx,dbName int 21h mov ah,10 lea dx,dbMax int 21h xor ch,ch mov cl,dbLen or cx,cx jz RW0 xor bx,bx RW3: mov al,dbStr[bx] mov [si+bx].nam,al inc bx loop RW3 mov al,'$' mov [si+bx].nam,al mov ah,9 lea dx,dbAge int 21h call InputNumber mov [si].age,ax mov ax,szWorker add ax,si mov [si].nxt,ax mov si,[si].nxt jmp short RW2 RW0: xor ax,ax mov [si].nxt,ax ret ReadWorker endp dbName db 10,13,'input worker name:$' dbAge db 10,13,'input worker age:$' dbMax db szName dbLen db ? dbStr db szName dup(?) ShowWorker proc mov ah,9 lea dx,dbShow int 21h lea si,arrayWorker SW1: mov ax,[si].nxt or ax,ax jz SW0 xor bx,bx SW2: mov al,[si+bx].nam mov dbStr[bx],al inc bx cmp al,'$' jnz SW2 mov ah,9 lea dx,dbStr int 21h mov al,' ' int 29h mov ax,[si].age call OutputNumber mov si,[si].nxt jmp short SW1 SW0: ret ShowWorker endp dbShow db 10,13 db 'Worker list:' db 10,13,'$' FindWorker proc mov ah,9 lea dx,dbName int 21h mov ah,10 lea dx,dbMax int 21h lea si,arrayWorker FW1: mov ax,[si].nxt or ax,ax jz FW0 mov bx,-1 FW2: inc bx mov al,[si+bx].nam cmp al,dbStr[bx] jz FW2 cmp al,'$' jz FW4 FW3: mov si,[si].nxt jmp FW1 FW4: cmp dbStr[bx],13 jnz FW3 mov ah,9 lea dx,dbYes int 21h mov ax,0924h mov dbStr[bx],al lea dx,dbStr int 21h mov al,' ' int 29h mov ax,[si].age call OutputNumber FW0: or ax,ax jnz FW01 mov ah,9 lea dx,dbNot int 21h FW01: ret FindWorker endp dbNot db 10,13,'Worker not found',10,13,'$' dbYes db 10,13,'Worker: $' SaveWorker proc ret SaveWorker endp LoadWorker proc ret LoadWorker endp InputNumber proc mov bx,10 xor di,di IN1: xor ax,ax int 16h cmp al,13 jz IN0 cmp al,'0' jb IN1 cmp al,'9' ja IN1 int 29h and ax,0Fh xchg di,ax xor dx,dx mul bx add di,ax jmp short IN1 IN0: mov ax,di ret InputNumber endp OutputNumber proc mov bx,10 xor cx,cx ON1: xor dx,dx div bx push dx inc cx or ax,ax jnz ON1 ON2: pop ax or al,'0' int 29h loop ON2 mov al,10 int 29h mov al,13 int 29h ret outputNumber endp ;тут типа массив arrayWorker label word end begin
Объяснение кода листинга программы
- В коде объявляется структура
workerс полямиnxt(следующий элемент в массиве),nam(имя работника) иage(возраст). - Создается массив структур
arrayWorkerдля хранения информации о работниках. - Вводится меню для пользователей с различными опциями.
- Опции обрабатываются через процедуры, например:
ReadWorkerдля добавления нового работника в массив;ShowWorkerдля отображения информации о всех работниках;FindWorkerдля поиска работника по имени;SaveWorkerиLoadWorkerдля сохранения и загрузки данных.
- Используются процедуры
InputNumberиOutputNumberдля ввода числовых значений и вывода чисел соответственно. - Имеются также определения для вывода различных сообщений, таких как
Worker not foundиWorker: $. - После всех процедур и опций программы, используется массив
arrayWorkerдля хранения данных о работниках.