База данных на основе массива записей - Assembler

Узнай цену своей работы

Формулировка задачи:

Комрады, учусь асму, а некоторые моменты не осиливаю задача в реализовании некой базы данных с записями "фамилия", "имя", "отчество", "пол", "год рождения". навести интерфейсик, менюшку набросать, а собстно что программа делать должна: 1) вносить новые записи, 2) удалять записи, 3) удалять записи по маске фамилии, 4) просматривать весь список. С пунктами 1,2,4 справился, а как записи по маске реализовать не осиливаю, не получается реализовать поиск. Можете помочь? Кстати, TASM выдает
**Error** abc.ASM(433) NUM_RASP(11) Extra characters on line **Error** abc.ASM(433) NUM_RASP(19) Extra characters on line
Как исправить? сам код:
.mo.386
;ver 0.5
 
;##  DATA SEGMENT  ##
DATASEG Segment USE16
;Menu items
    menu_title    db  'Menu:$'
    menu_add      db  '"A" - dobavit zapis$'
    menu_print    db  '"P" - vivod vsex zapisey na ekran$'
    menu_del      db  '"D" - delete zapis(i)$'
    menu_quit     db  '"Q" - quit program$'
    
;Add items
    enter_familia    db  'Enter Family:$'
    enter_name       db  'Enter Name:$'
    enter_otchestvo  db  'Enter Otchestvo:$'
    enter_pol        db  'vvedite pol (m/f):$'
    enter_year       db  'Date Of Birth:$'
    invite           db  '-> $'
 
;Print items
    separator        db  79 dup('-'),'$'
    print_title      db  'Zapisi na danniy moment:$'
 
;Del items
    whych           db  'Vvedite familiy zapisi dlya udaleniya: $'
    num_str         db  4, ?, 4 dup(?)
    num_dec         dw  ?
    sign            db  0
    
;Record
    record struc
        surname    db 20, ?, 20 dup(?)
        name       db 20, ?, 20 dup(?)
        otchectvo  db 20, ?, 20 dup(?)
        pol        db  2, ?, 2 dup(?)
        year       db  5, ?, 5 dup(?)
    record ends
    base record 20 dup(<>)
    tmp_rec record <>
    count db 0
    
DATASEG Ends
;##  /DATA SEGMENT  ##

;##  STACK SEGMENT  ##
STACKSEG Segment Stack USE16
    db 256 dup(?)
STACKSEG Ends
;##  /STACK SEGMENT  ##

;##  CODE SEGMENT  ##
CODESEG Segment USE16
    Assume CS:CODESEG, DS:DATASEG, SS:STACKSEG

;##  Procedure`s And Macro`s  ##
 
;## Vyvod pustoi stroki ##
writeln macro
    push dx
    push ax
    mov ah,2
    mov dl,13
    int 21h
    mov dl,10
    int 21h
    pop ax
    pop dx
endm
 
;##  Vyvod stroki  ##
write macro string
    push ax
    push dx
    mov ah,09h
    mov dx,offset string
    int 21h
    pop dx
    pop ax
endm

;##  VVOD stroki  ##
read macro string
    push ax
    push dx
    mov ah,0Ah
    mov dx,offset string
    int 21h
    pop dx
    pop ax
endm

;##  Vyvod menu  ##
print_menu macro
    clrscr
    write menu_title
    writeln
    write menu_add
    writeln
    write menu_print
    writeln
    write menu_del
    writeln
    write menu_quit
    writeln
endm
 
;##  exit prog  ##
exit macro
    mov al,0
    mov ah,4Ch
    int 21h
endm
 
;##  Clear Screen  ##
clrscr macro
    push ax
    push bx
    push cx
    push dx
    mov ax,0600h
    mov bh,07h
    xor cx,cx
    mov dh,24
    mov dl,80
    int 10h
    mov ah,0fh
    int 10h
    mov dx,0101h
    mov ah,2
    int 10h
    pop dx
    pop cx
    pop bx
    pop ax
endm
 
clscr macro
  push AX
  push BX
  push CX
  push DX
  mov AH,6
  xor AL,AL
  mov BH,00000111b
  xor CX,CX
  mov DH,24d
  mov DL,79d
  int 10h
  pop DX
  pop CX
  pop BX
  pop AX
  ret
endm
 
;##  Readkey  ##
readkey macro registr
    push ax
    mov ah,10h
    int 16h
    mov registr,ax
    pop ax
endm
 
;##  write(#7)  ##
pisk macro
    push ax
    push dx
    mov ah,2
    mov dl,07h
    int 21h
    pop dx
    pop ax
endm
 
;# v konze stroki postavit` dollar #
dollar macro
    push ax
    push bx
    push dx
    inc dx
    mov bx,dx
    xor cx,cx
    mov al, byte ptr [bx]
    inc al
    cbw
    add bx,ax
    mov byte ptr [bx],'$'
    pop dx
    pop bx
    pop ax
endm

;##  Add Record  ##
add_record proc
    clrscr
    mov ah,0Ah
    write enter_familia
    writeln
    write invite
    mov dx,offset base.surname
    add dx,bx
    int 21h
    dollar
    clrscr
    write enter_name
    writeln
    write invite
    mov dx,offset base.name
    add dx,bx
    int 21h
    dollar
    clrscr
    write enter_otchestvo
    writeln
    write invite
    mov dx,offset base.otchectvo
    add dx,bx
    int 21h
    dollar
    clrscr
    write enter_pol
    writeln
    write invite
    mov dx,offset base.pol
    add dx,bx
    int 21h
    dollar
    clrscr
    write enter_year
    writeln
    write invite
    mov dx,offset base.year
    add dx,bx
    int 21h
    dollar
    ret
add_record endp

;# write(' ');
probel macro
    push ax
    mov ah,02h
    mov dl,' '
    int 21h
    pop ax
endm

;# Poriadkoviy nomer #
;print_number macro
;   push ax
;   push dx
;   mov ah,02h
;   mov dx,di
;   add dl,'0'
;   int 21h
;   mov dl,')'
;   int 21h
;   mov dl,' '
;   int 21h
;   pop dx
;   pop ax
;endm

;## print record ##
print_record proc
    push ax
    mov ah,09h
    write separator
    writeln
;   print_number
;   inc di
    mov dx,offset base.surname
    add dx,bx
    add dx,2
    int 21h
    probel
    mov dx,offset base.name
    add dx,bx
    add dx,2
    int 21h
    probel
    mov dx,offset base.otchectvo
    add dx,bx
    add dx,2
    int 21h
    probel
    mov dx,offset base.pol
    add dx,bx
    add dx,2
    int 21h
    probel
    mov dx,offset base.year
    add dx,bx
    add dx,2
    int 21h
    writeln 
    pop ax
    ret
print_record endp

;##  print_base  ##
print_base proc
    push bx
    clrscr
    write print_title
    writeln
    xor cx,cx
    mov cl,count
    xor bx,bx
    mov ah,09h
    xor di,di
    inc di
    cmp cx,0
    je vse
out:
    call print_record
    add bx,type record
    loop out
vse:
    write separator
    pop bx
    ret
print_base endp

;# Raspoznavanie chisla #
num_rasp macro
    push bx
    xor cx,cx
    mov si,0
    mov cl, byte ptr di[1]
    mov bx,2
    mov dx,1
    cmp cx,1
    je lop
    dec cx
pod:    
    imul dx,10
    loop pod
    mov cl, byte ptr di[1]
lop:
    xor ax,ax
    mov al, byte ptr di[bx]
    inc bx
    sbb al,'0'
    imul ax,dx
 
    push cx
    push ax
    mov ax,dx
    mov cx,10
    push dx
    xor dx,dx
    idiv cx
    pop dx
    mov dx,ax
    pop ax
    pop cx
 
    add si,ax
    loop lop
    pop bx
endm

;# base[num] -> tmp_rec
to_tmp macro num
    push bx
    push ax
    mov si,offset base
    mov ax,num
    mov cx,type record
    mul cx
    add si,ax
    mov cx,type record
    xor bx,bx
trans:
    mov al, byte ptr si[bx]
    mov byte ptr tmp_rec[bx],al
    inc bx
    loop trans
    pop ax
    pop bx
endm
 
;# tmp_rec -> base[num]
from_tmp macro num
    push bx
    push ax
    mov si,offset base
    mov ax,num
    mov cx,type record
    mul cx
    add si,ax
    mov cx,type record
    xor bx,bx
trans_1:
    mov al, byte ptr tmp_rec[bx]
    mov byte ptr si[bx],al
    inc bx
    loop trans_1
    pop ax
    pop bx
endm
 
;##  Del Record  ##
del_record proc
st:
    call print_base
    writeln
    write whych
    mov ah,0Ah
    mov dx,offset num_str
    int 21h
    mov di, offset num_str
    num_rasp
    mov num_dec,si
    mov al,count
    mov ah,0
    cmp si,0
    je st
    cmp si,ax ;num_dec ? count
    jl go
    jg st
    cmp si,0
    jle st
    dec al
    mov count,al
    sbb bx,type record
    jmp fin
go:
    push ax
    push dx
    mov ax,num_dec
    mov ah,0
kk:
    to_tmp ax
    dec ax
    from_tmp ax
    inc ax
    inc ax
    cmp al,count
    jne kk
    mov al,count
    dec al
    mov count,al
    sbb bx,type record
    pop dx
    pop ax
fin:
    ret
del_record endp

src macro ;pododvigaet nomer bukvy v maske
    mov al, lenm
    cmp al, i
    je check_end
    inc i
    mov bl, i
    mov cl, maska[bx+1]
endm
 
dst macro ;pododvigaet nomer bukvy v stroke
    mov al, lenr
    cmp al, j
    je error
    inc j
    mov bl, j
    mov dl, byte ptr base[si][bx+1]
endm

;##  /Procedure`s And Macro`s  ##
 
;##  Programm  ##
  start:
    mov ax,DATASEG
    mov ds,ax
    xor bx,bx
;-------------
what_to_do:
    print_menu
    readkey dx
    cmp dl,61h      ; check 'a'
    je add_r
    cmp dl,64h      ; check 'd'
    je del_r
 
    cmp dl,71h      ; check 'q'
    je quit
    cmp dl,'p'      ; check 'q'
    je print
    pisk
    jmp what_to_do
add_r:
    call add_record
    inc count
    add bx,type record
    jmp what_to_do
del_r:
    push ax
    mov al,count
    cmp al,0
    pop ax
    je er
    call del_record
er:
    jmp what_to_do
er_1:
    jmp what_to_do  
print:
    call print_base
    readkey dx
    jmp what_to_do  
quit:
    exit
CODESEG Ends
;##  /CODE Segment  ##
End start
;##  /Programm  ##
ASM editor from, tasm 4.1 если важно вдруг)

Решение задачи: «База данных на основе массива записей»

textual
Листинг программы
        imul dx,10
...
        imul ax,dx

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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