Структура: Необходимо организовать ввод данных в массив структур и поиск записи по имени. - 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

Объяснение кода листинга программы

  1. В коде объявляется структура worker с полями nxt (следующий элемент в массиве), nam (имя работника) и age (возраст).
  2. Создается массив структур arrayWorker для хранения информации о работниках.
  3. Вводится меню для пользователей с различными опциями.
  4. Опции обрабатываются через процедуры, например:
    • ReadWorker для добавления нового работника в массив;
    • ShowWorker для отображения информации о всех работниках;
    • FindWorker для поиска работника по имени;
    • SaveWorker и LoadWorker для сохранения и загрузки данных.
  5. Используются процедуры InputNumber и OutputNumber для ввода числовых значений и вывода чисел соответственно.
  6. Имеются также определения для вывода различных сообщений, таких как Worker not found и Worker: $.
  7. После всех процедур и опций программы, используется массив arrayWorker для хранения данных о работниках.

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы