База данных на основе массива записей - Assembler
Формулировка задачи:
Комрады, учусь асму, а некоторые моменты не осиливаю
задача в реализовании некой базы данных с записями "фамилия", "имя", "отчество", "пол", "год рождения".
навести интерфейсик, менюшку набросать, а собстно что программа делать должна: 1) вносить новые записи, 2) удалять записи, 3) удалять записи по маске фамилии, 4) просматривать весь список.
С пунктами 1,2,4 справился, а как записи по маске реализовать не осиливаю, не получается реализовать
поиск. Можете помочь?
Кстати, TASM выдает
Как исправить?
сам код:
ASM editor from, tasm 4.1 если важно вдруг)
**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 ##
Решение задачи: «База данных на основе массива записей»
textual
Листинг программы
imul dx,10 ... imul ax,dx
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д