Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2018, 20:43   #1
Fillimon
Пользователь
 
Регистрация: 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
Fillimon вне форума Ответить с цитированием
Старый 22.05.2018, 21:10   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Fillimon Посмотреть сообщение
Глянье плз, кто глазастый
Такие вещи разве смотрят невооруженным взглядом? Это в старину программист не мог остановить программу в нужном месте и посмотреть, что там происходит. Отладчики умные люди ещё 30 лет назад придумали.
Black Fregat вне форума Ответить с цитированием
Старый 22.05.2018, 21:33   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Микроскоп сразу показал первую причину ошибок.
Команда movsb пишет в сегмент es:, а он не установлен
Black Fregat вне форума Ответить с цитированием
Старый 22.05.2018, 22:07   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..и вообще, что-то ни одного цикла не видно.
что должна делать программа?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Помогите найти ошибку в коде sanya_prokopchuk Помощь студентам 1 03.11.2017 21:24
Помогите, пожалуйста, найти ошибку в коде (найти сумму факториалов чётных чисел в заданном диапазоне) kris14 Паскаль, Turbo Pascal, PascalABC.NET 8 25.10.2017 15:42
Помогите найти ошибку в коде Михаил85 JavaScript, Ajax 2 19.06.2016 21:27
Помогите найти ошибку в коде timcryt Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 13.03.2016 18:23
Помогите найти ошибку в коде NYork Помощь студентам 3 16.12.2014 19:45