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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2011, 19:56   #1
Playa-RC
Пользователь
 
Регистрация: 03.12.2011
Сообщений: 13
По умолчанию Массив структур. Не могу найти ошибку.

Всем Доброго вечера! В универе задали написать программу, с помощью которой пользователь вводит данные для структуры с клавиатуры и введенная структура полностью выводится на экран. Вроде написал, но не могу найти ошибку, для первого поля структуры все работает, когда пытаюсь сделать для всех (а их там 3), то программа выводит непонятно что. Не могу найти ошибку, прошу помощи. Заранее спасибо!

Вот код:
PHP код:
.model small
.stack 100h

worker struc                   
;информация о сотруднике
nam db 15 dup 
(' ')         ;имя
lastnam db 15 dup 
(' ')   ; фамилия
age db  2 dup 
(' ')           ;возраст
worker ends

.data

next db 10
,13,'$'
Vvod3 db 'Input data >>>>>>>>> ','$'
mnam db 10,13,'Enter name: ''$'
mlastnam db 10,13,'Enter Lastname: ','$'
mage db 10,13,'Enter Age: ','$'
mour db 10,13,10,13,'Our structur:',10,13,'$'

string db 128 dup (' ')

N=3
mas_sotr worker N dup 
(<>)

.
code

start
:
mov ax,@data
mov ds
,ax

jmp start_prog

enter_string proc 
;принемает один параметр для loop cx
xor si,si
lea si
,[string]
buff1:
xor 
ax,ax
begin_v
:
mov ah,0
int 16h 
cmp al
,13
jz v1
cmp al
,' '
jb begin_v
cmp al
,'}'
ja begin_v
mov 
[si],al
int 29h
inc si
loop buff1
mov byte ptr 
[si],'$'
v1:
ret
endp

mov_to_struct proc 
;принемает 4 пареметратип структуры в bxразмер 
push ds
pop es  
mov di
,dx
cld
lea si
,string
rep movsb
add si
,1
mov byte ptr 
[si],'$'
ret
endp 
массива в diразмео принимаемой строки в dxи cx для rep

start_prog
:
lea dx,vvod3
mov ah
,09h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ввод имени
mov cx
,n
mov bx
type worker
lea di
,mas_sotr  
push cx
cycl
:
push cx
lea dx
,mnam
mov ah
,09h
int 21h
mov cx
,16
call enter_string
lea dx
,[di].nam
mov cx
,16
call mov_to_struct

lea dx
,mlastnam
mov ah
,09h
int 21h
mov cx
,15
call enter_string
lea dx
,[di].lastnam
mov cx
,15
call mov_to_struct

lea dx
,mage
mov ah
,09h
int 21h
mov cx
,2
call enter_string
lea dx
,[di].age
mov cx
,2
call mov_to_struct
add di
,bx
pop cx
loop cycl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
вывод структуры
lea dx
,mour
mov ah
,09h
int 21h
mov cx
,n
mov bx
type worker
lea di
,mas_sotr  
cycl1
:
lea dx,[di].nam
mov ah
,09h
int 21h

lea dx
,[di].lastnam
mov ah
,09h
int 21h

lea dx
,[di].age
mov ah
,09h
int 21h

lea dx
,next
mov ah
,09h
int 21h
add di
,bx
loop cycl1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ax,4c00h
int 21h
end start 

Скрин работы программы:
Изображения
Тип файла: jpg Без имени-1.jpg (149.1 Кб, 124 просмотров)
Playa-RC вне форума Ответить с цитированием
Старый 03.12.2011, 22:17   #2
Playa-RC
Пользователь
 
Регистрация: 03.12.2011
Сообщений: 13
По умолчанию

Все, нашел! Ошибка была в перезаписи регистра di, которую я не заметил.
Вот код рабочей программы, если кому нужно:

Цитата:
.model small
.stack 100h

worker struc ;информация о сотруднике
nam db 15 dup (' ') ;имя
lastnam db 15 dup (' ') ; фамилия
age db 10 dup (' ') ;возраст
worker ends

.data

next db 10,13,'$'
Vvod3 db 'Input data >>>>>>>>> ','$'
mnam db 10,13,'Enter name: ', '$'
mlastnam db 10,13,'Enter Lastname: ','$'
mage db 10,13,'Enter Age: ','$'
mour db 10,13,10,13,'Our structur:',10,13,'$'

string db 128 dup (' ')

N=3
mas_sotr worker N dup (<>)

.code

start:
mov ax,@data
mov ds,ax

jmp start_prog

enter_string proc ;принемает один параметр для loop - cx, и строку в si
buff1:
xor ax,ax
begin_v:
mov ah,0
int 16h
cmp al,13
jz v1
cmp al,' '
jb begin_v
cmp al,'}'
ja begin_v
mov [si],al
int 29h
inc si
loop buff1
v1:
mov byte ptr [si],' '
add si,1
mov byte ptr [si],'$'
ret
endp

mov_to_struct proc ;принемает 4 пареметра: тип структуры в bx, размер
xor si,si
push ds
pop es
push di
mov di,dx
cld
lea si,string
rep movsb
pop di
ret
endp ; массива в di, размео принимаемой строки в dx, и cx для rep

start_prog:
lea dx,vvod3
mov ah,09h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;ввод имени
mov bx, type worker
lea di,mas_sotr
mov bp,n

cycl1:
lea dx,mnam
mov ah,09h
int 21h

mov cx,15
lea si,[string]
call enter_string
lea dx,[di].nam
mov cx,15
call mov_to_struct

lea dx,mlastnam
mov ah,09h
int 21h
mov cx,15
lea si,[string]
call enter_string
lea dx,[di].lastnam
mov cx,15
call mov_to_struct

lea dx,mage
mov ah,09h
int 21h
mov cx,10
lea si,[string]
call enter_string
lea dx,[di].age
mov cx,10
call mov_to_struct

add di,bx

dec bp
cmp bp,0
ja cycl1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;вывод структуры
lea dx,mour
mov ah,09h
int 21h

mov bx, type worker
lea di,mas_sotr
mov cx,n
cycl2:
lea dx,[di].nam
mov ah,09h
int 21h

lea dx,[di].lastnam
mov ah,09h
int 21h

lea dx,[di].age
mov ah,09h
int 21h

lea dx,next
mov ah,09h
int 21h

add di,bx
loop cycl2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;

mov ax,4c00h
int 21h
end start
Playa-RC вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку GoldmasteR PHP 5 20.02.2011 12:37
Не могу найти ошибку.. одномерный массив, убывающая последовательность Malloperro Помощь студентам 1 23.12.2010 21:15
Не могу найти ошибку Tesmont Помощь студентам 2 20.05.2009 21:00
Не могу найти ошибку! Эдуард Общие вопросы C/C++ 7 27.02.2008 16:34