Структура: Необходимо организовать ввод данных в массив структур и поиск записи по имени. - 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
для хранения данных о работниках.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д