Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Присвоение значения полю структуры 
V
    Опции темы
kuller
Дата 16.5.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Здравствуйте!!!!
Подскажите пожалуйста в чем дело: ввожу с клавиатуры строку и пытаюсь ее присвоить полю структуры.....но почему то ничего не выходит.

есть структура:
Код

;структура "Автомобиль"
avto struc
   marka db 10 dup ('$')
   god db 4 dup ('$')
   cvet db 10 dup ('$')
   obem_baka db 3 dup ('$')
   obem_dvigatelya db 5 dup ('$')
avto ends


это вот в сегмента Data:
Код

test avto <>
string  label  byte
max     db 20
len     db ?
ary     db  21 dup ('$')


затем ввожу строку:
Код

;буферизированный ввод с клавиатуры "Марки" авто
        lea dx, string
        mov ah, 0ah
        int 21h


и вот теперь пытаюсь введенное начение присвоить полю MARKA
Код

        mov si, offset ary    ------- это источник, тут хранится введенная с клавиатуры строка
        mov di, offset test.marka ----- это приемник, сюда я хочу записать введенное с клавиатуры значение
        mov cl,len  ----- это длина введенной строки
        mov ch,0
        rep movsb   ----- а вот с помощью этого пытаюсь по байтно скопировать из ary в test.marka


после того как отработл этот кусок по копированию пытаюсь вывести содержимое поля .... но он ничего не выводит, как-будто в поле ничего не занеслось!

Помогите разобраться в чем дело
Заранее спасибо!
PM MAIL   Вверх
shurf
Дата 16.5.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Просто программист



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.7.2007
Где: Чернигов

Репутация: нет
Всего: нет



В ary точно есть введённые данные?

Если да, надо проверить, чтобы DS и ES указывали на один
сегмент данных, так как MOVSB копирует байт DS:SI в ES:DI

Также, надо убедиться, что выбрано правильное направление
копирования. Флаг DF должен быть равен 0, чтобы использовалось
инкрементирование индексов. Сделать это можно командой CLD

PM MAIL WWW ICQ Skype Jabber   Вверх
kuller
Дата 17.5.2009, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



shurf, спасибо за советы!!!
но я решил этот вариант отложить и сделал копирование из ary в поле структуры посимвольно с использованием loop, хотя надо бы и с этим разобраться!!!
PM MAIL   Вверх
Mikl_
Дата 19.5.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



kuller, как-то так  smile 
Код
.286
.model tiny
.code
org 100h
avto struc
   marka db 10 dup ('$')
   god db 4 dup ('$')
   cvet db 10 dup ('$')
   obem_baka db 3 dup ('$')
   obem_dvigatelya db 5 dup ('$')
avto ends
start:    mov si,offset ary
    lea di,test1.marka
    mov cx,len
    rep movsb
    lea dx,test1.marka
    mov ah,9
    int 21h
    retn
test1 avto <>
ary db 'IBM'
len = $-ary
end start
 И всё работает! Может быть не нравилось слово test -- оно совпадает с ассемблерной командой
PM MAIL   Вверх
kuller
Дата 19.5.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Mikl_, посмотрите, вроде бы делаю все так, а результат опять не получаю, ничего в поле структуры не заносится, вот мой код:

Код

title "Сруктуры в Ассемблере"

stacksg   segment para stack 'Stack'
      dw   32 dup(?)
stacksg    ends

       ;макрос для вывода строк на экран
       vivod macro mess
       mov ah,09h
       lea dx, mess
       int 21h
       endm

       ;макрос для перехода на новую строку
       perexod macro nom_str, nom_poz
       mov dh, nom_str
       mov dl, nom_poz
       mov bh, 00
       mov ah, 02h
       int 10h
       endm

;структура "Автомобиль"
avto struc
   marka db 10 dup ('$')
   god db 10 dup ('$')
   cvet_av db 10 dup ('$')
   obem_baka db 10 dup ('$')
   obem_dvigatelya db 10 dup ('$')
avto ends

datasg      segment para 'Data'    
mes_vvod_1 db 'Vvedite makru mashiny: $'
first avto <>
string  label  byte
max     db 10
len     db ?
ary     db  11 dup ('$')
datasg      ends

codesg      segment para 'Code'
begin:      
        assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
        push        ds        
        sub        ax,ax    
        push        ax        
        mov        ax,datasg    
        mov        ds,ax    

        perexod 0,0
        vivod mes_vvod_1

        lea dx, string
        mov ah, 0ah
        int 21h

        lea si, ary
        lea di, first.marka
        mov cl,len
        mov ch,0
        rep movsb

        perexod 1,0
        vivod first.marka

        ;жду нажаие клавишы
        mov ah, 01h
        int 21h 
       
        ;выход в DOS
        mov ah,4ch
        int 21h

codesg    ends
      end  begin 

PM MAIL   Вверх
shurf
Дата 19.5.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Просто программист



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.7.2007
Где: Чернигов

Репутация: нет
Всего: нет



Я, всё таки, советую проинициализировать сегментный регистр ES, чтобы правильно выполнялась
команда MOVSB

Вот так работает:
Код

...
begin:      
        assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
        push        ds        
        sub        ax,ax    
        push        ax        
        mov        ax,datasg    
        mov        ds,ax    
        mov        es,ax   ; !!!!!!!!!!!!!!!!!!!!!!!
...


PM MAIL WWW ICQ Skype Jabber   Вверх
Mikl_
Дата 20.5.2009, 03:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



kuller, 
Код
title "Сруктуры в Ассемблере"
stacksg   segment para stack 'Stack'
      dw   32 dup(?)
stacksg    ends
       ;макрос для вывода строк на экран
       vivod macro mess
       mov ah,09h
       lea dx, mess
       int 21h
       endm
       ;макрос для перехода на новую строку
       perexod macro nom_str, nom_poz
       mov dh, nom_str
       mov dl, nom_poz
       mov bh, 00
       mov ah, 02h
       int 10h
       endm
;структура "Автомобиль"
avto struc
   marka db 10 dup ('$')
   god db 10 dup ('$')
   cvet_av db 10 dup ('$')
   obem_baka db 10 dup ('$')
   obem_dvigatelya db 10 dup ('$')
avto ends
datasg      segment para 'Data'    
mes_vvod_1 db 'Vvedite makru mashiny: $'
first avto <>
string  label  byte
max     db 10
; len     db ? <-- заводишь переменную а ничего туда не помещаешь -- лишнее убери
ary     db  11 dup ('$')
datasg      ends
codesg      segment para 'Code'
begin:      
        assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
;        push        ds        <--лишнее убери
;        sub        ax,ax    <--лишнее убери
;        push        ax        <--лишнее убери
        mov ax,datasg    
        mov ds,ax    
        mov es,ax    ;это то, о чем всё врем твердит shurf у тебя создается EXE у меня COM в котором cs=ds=es
        perexod 0,0
        vivod mes_vvod_1
        lea dx, string
        mov ah, 0ah
        int 21h
        lea si, ary
        lea di, first.marka
        mov cx,(first.god-first.marka); <-- получаем размер поля avto.marka
        rep movsb
        perexod 1,0
        vivod first.marka
        ;жду нажаие клавишы
        mov ah, 01h
        int 21h        
        ;выход в DOS
        mov ah,4ch
        int 21h
codesg    ends
      end  begin 

PM MAIL   Вверх
kuller
Дата 20.5.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Mikl_, как нам в универе говорили вот этот кусок:

Код

string  label  byte
max     db 10
len     db ?
ary     db  11 dup ('$')


при вводе строки с клавиатуры ОБЯЗАТЕЛЕН, тут:
MAX - это максимально возможная длина вводимой строки;
LEN - реальная длина введенной строки

А по помоду  rep movsb изменил в своей программе:

Код

        assume cs:codesg, ds:datasg, ss:stacksg, es:datasg    
        mov        ax,datasg    
        mov        ds,ax    
        mov         es,ax


и все отлично работает!!!
значит всетаки проблема была в сегментном регистре ES

Всем спасибо!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.