Пользователь
Регистрация: 16.04.2018
Сообщений: 13
|
Помогите найти ошибку в коде (TASM)
Структура вида :
Код:
lab struc
fam db 15 dup (" ")
nam db 15 dup (" ")
pat db 15 dup (" ")
gender db " "
birth db 12 dup (" ")
lab ends
mas lab 10 dup (<>) ;массив структур
i db 0 ; переменная отвечающая за кол-во занятых эл-тов массива mas
buf db 20,?,20 dup(?) ;буффер для чтения
Заполняю её этой процедурой:
Код:
input proc
mov ah,09h ;читаем фамилию
lea dx,v11 ;Запрашиваем действия пользователя
int 21h
mov ah,0ah ;читаем строку в buf
lea dx,buf
int 21h
cld
mov bx,(type lab) ;т.к. у меня массив структур лаб, берём её размер
mov ax,bx
mul i ;и умножаем на переменную отвечающую за текущий эл-т массива
mov bx,ax ; смещение по эл-ту массива лежит в bx
lea di,mas ; встаём в начало массива
add di,bx ; и прибавляем смещение
lea si,buf ; берём адрес источника для копирования строк
add si,2 ; пропускаем первые 2 бита
mov cx, 15 ; кладём в счётчик 15
rep movsb ;копируем строку buf в mas.fam
; далее подробных комментариев не будет, одно и то же там.
mov ah,09h ;читаем имя
lea dx,v12 ;Запрашиваем действия пользователя
int 21h
mov ah,0ah ;читаем строку в buf
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,15 ;добавляем смещение после поля fam
add di,bx
lea si,buf
add si,2
mov cx, 15
rep movsb
mov ah,09h ;читаем отчество
lea dx,v13 ;Запрашиваем действия пользователя
int 21h
mov ah,0ah ;читаем строку в buf
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,30 ;смещение после поля nam+fam
add di,bx
lea si,buf
add si,2
mov cx, 15
rep movsb
mov ah,09h ;читаем пол
lea dx,v14 ;Запрашиваем действия пользователя
int 21h
mov ah,0ah ;читаем строку в buf
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,45 ;смещение после nam+fam+pat
add di,bx
lea si,buf
add si,2
mov cx, 1 ;перемещаем один символ, т.к. просим ввести либо F либо М
rep movsb
mov ah,09h ; читаем дату рождения
lea dx,v15 ;Запрашиваем действия пользователя
int 21h
mov ah,0ah ;читаем строку в buf
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,46 ;смещение от полей fam+nam+pat+gender
add di,bx
lea si,buf
add si,2
mov cx, 12 ;Копируем 12 символов
rep movsb
inc i ;Увеличиваем переменную, отвечающую за кол-во занятых эл-тов массива mas
ret ;выходим из процедуры
input endp
В чём проблема? Я ошибки не вижу, и не понимаю почему, но программа глючит каждый раз по разному, хотя я ничего не меняю, то она виснет до поля отчества, то после, не просит ввести пол, и циклится и прыгает на начало снова и снова... может я с адресами и смещениями напутал? Глянье плз, кто глазастый. ниже фул программы приложу:
Код:
.model small
.stack 256
.data
str1 db "The database program greeting you!",0ah,0dh,'$'
str2 db 0ah,0dh,"Enter the number of menu item as you wanted to continue, or enter something else to exit.",0ah,0dh, "1. Add new entry.",0ah,0dh, "2. Delete entry.",0ah,0dh, "3. Look list by gender.",0ah,0dh, "4. Look list by birthday.",0ah,0dh,'$'
str3 db 0ah,0dh,"Are you sure want to exit? Press 'n' to deny.",0ah,0dh,'$'
v11 db 0ah,"Enter family:",0ah,0dh,'$'
v12 db 0ah,"Enter name:",0ah,0dh,'$'
v13 db 0ah,"Enter patronymic:",0ah,0dh,'$'
v14 db 0ah,"Enter gender. F - female, M - male",0ah,0dh,'$'
v15 db 0ah,"Enter birthday:",0ah,0dh,'$'
lab struc
fam db 15 dup (" ")
nam db 15 dup (" ")
pat db 15 dup (" ")
gender db " "
birth db 12 dup (" ")
lab ends
mas lab 10 dup (<>)
i db 0
buf db 20,?,20 dup(?)
.code
input proc
mov ah,09h ;читаем фамилию
lea dx,v11
int 21h
mov ah,0ah
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add di,bx
lea si,buf
add si,2
mov cx, 15
rep movsb
mov ah,09h ;читаем имя
lea dx,v12
int 21h
mov ah,0ah
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,15
add di,bx
lea si,buf
add si,2
mov cx, 15
rep movsb
mov ah,09h ;читаем отчество
lea dx,v13
int 21h
mov ah,0ah
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,30
add di,bx
lea si,buf
add si,2
mov cx, 15
rep movsb
mov ah,09h ;читаем пол
lea dx,v14
int 21h
mov ah,0ah
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,45
add di,bx
lea si,buf
add si,2
mov cx, 1
rep movsb
mov ah,09h ; читаем дату рождения
lea dx,v15
int 21h
mov ah,0ah
lea dx,buf
int 21h
cld
mov bx,(type lab)
mov ax,bx
mul i
mov bx,ax
lea di,mas
add bx,46
add di,bx
lea si,buf
add si,2
mov cx, 12
rep movsb
inc i
ret
input endp
start:
mov ax, @data
mov ds,ax
mov ah,09h
lea dx,str1
int 21h
menu:
mov ah,09h
lea dx,str2
int 21h
mov ah,01h
int 21h
cmp al,'1'
je choise1
cmp al,'2'
je choise2
cmp al,'3'
je choise3
cmp al,'4'
je choise4
mov ah,09h
lea dx,str3
int 21h
mov ah,01h
int 21h
cmp al,'n'
je menu
jmp exit
choise1:
call input
jmp menu
choise2:
jmp menu
choise3:
jmp menu
choise4:
jmp menu
exit:
mov ax,4c00h
int 21h
end start
|