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