Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строковые операции, упр-е флагами и вывод результа, Помогите бедному студенту!!! (плз) 
:(
    Опции темы
froggy82
Дата 11.10.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 25.9.2006
Где: Архангельск

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



Итак перешли плавно в тему Строковые операции...

Задание: 
1. Напишите процедуру, которая «склеивает» две строки и записывает результат в третью. Обе строки должны быть считаны с клавиатуры, результат должен быть отображён на экране.

2. Дана строка. Подсчитать количество гласных, встречающихся в ней. Результат и первоначальную строку вывести на экран.

Примечание: Все  входные переменные, необходимые для решения задания вводит пользователь. Результат работы программы необходимо вывести на экран. 
Чтение и запись строк выполнять только с использованием строковых операций. Если необходимо проверить вхождение данного символа в некоторое множество, можно воспользоваться дополнительной строкой:

    CmpStr    db    “EAUOIeauoi” {гласные буквы}

В этом случае поиск осуществляется с помощью команды SCASB.


Честно совсем не понимаю, наведите на путь истинный!  smile 

Это сообщение отредактировал(а) froggy82 - 11.10.2006, 12:38
PM MAIL ICQ   Вверх
anwe
Дата 11.10.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дать общую стратегию решения можно. Реализовывай сам!

По п.1.
Для ввода строки используй функция 0Ah DOS. Во втором байте буфера, который укажешь для помещения в него строки будет содержаться длина введеной строки. Далее записываешь в di адрес (смещение) первой строки с учетом ее длины, а в si - второй, ее начало. И две строки склеиваешь командой movs(b,d,w) с превиксом rep, предваретильно поместв в cx длину второй строки. Первую строку, уже склееную выводишь.
Мелочи типа перевод картеки после ввода первой строки, а также способ вывода на экран (средствами BIOS'а или прямым копированием в видеопамять) разберешь сам.

По п.2.
В cl - 0 (и это понятно  smile ). Далее заносишь в al первый символ из строки “EAUOIeauoi” и используешь scasb с префиксом repne. Следующей строкой программки будет inc cl. заносишь в al слеующий и так далее.
Выводишь cl.
PM MAIL   Вверх
nobodyzzz
Дата 12.10.2006, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



п2. схематично так =))
Код

mov si, CmpStr
mov dx, <text inputed by user>.length
xor bx, bx
cout:
lodsb
mov di, <text inputed by user>
mov cx, CmpStr.length
repnz scasb
jnz next
inc bx
next:
dec dx
jnz count 



Это сообщение отредактировал(а) nobodyzzz - 12.10.2006, 09:12
PM MAIL   Вверх
dumb
Дата 12.10.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



вообще, такие темы надо в "Центр помощи" создавать...

иэх, не хотел готовое давать, чтобы сам позанимался... smile
но "схематичные советы" содержат ошибки, поэтому даю правильный ответ:

1.
Код

    .model small
    .386
    .stack
    .data

mes1 db 0ah, 0dh, 'str1: $'
mes2 db 0ah, 0dh, 'str2: $'
mes3 db 0ah, 0dh, 'str3: $'
str1 db 50,0, 51 dup (0)
str2 db 50,0, 51 dup (0)
str3 db 100 dup ('$')

    .code
start:
    mov ax, @data
    mov ds, ax
    mov es, ax
    mov dx, offset mes1
    mov ah, 9
    int 21h
    inc ah
    mov dx, offset str1
    int 21h
    mov dx, offset mes2
    mov ah, 9
    int 21h
    inc ah
    mov dx, offset str2
    int 21h
    mov si, offset str1 + 1
    xor cx, cx
    mov cl, [si]
    inc si
    mov di, offset str3
    mov bx, di
    cld
    rep movsb
    mov si, offset str2 + 1
    mov cl, [si]
    inc si
    rep movsb
    mov dx, offset mes3
    mov ah, 9
    int 21h
    mov dx, bx
    int 21h
    mov ax, 4c00h
    int 21h
    end start


2.
Код

    .model small
    .386
    .stack
    .data

mes1 db 0ah, 0dh, 'str1: $'
mes2 db 0ah, 0dh, 'count: $'
str1 db 50,0, 51 dup (0)

CmpStr db 'EAUOIeauoi' ; гласные буквы
CmpStrLen = $ - CmpStr

    .code
start:
    mov ax, @data
    mov ds, ax
    mov es, ax

    mov dx, offset mes1
    mov ah, 9
    int 21h
    inc ah
    mov dx, offset str1
    int 21h

    mov si, offset CmpStr
    xor bx, bx
    mov dx, CmpStrLen
next_char:
    lodsb
    mov di, offset str1 + 1
    xor cx, cx   
    mov cl, [di]
    inc di
continue:
    repnz scasb
    jnz not_found
    inc bx
    jmp continue
not_found:
    dec dx
    jnz next_char

    mov dx, offset mes2
    mov ah, 9
    int 21h

    mov ax, bx ; упрощенный вывод числа. работает, если число < 99.
    aam
    xchg ah, al
    add ax, '00'
    int 29h
    mov al, ah
    int 29h

    mov ax, 4c00h
    int 21h
    end start

PM MAIL   Вверх
Dave
Дата 3.1.2009, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

 .model small
    .386
    .stack
    .data
mes1 db 0ah, 0dh, 'str1: $'
str1 db 10,0, 11 dup (0)
    .code
start:
    mov ax, @data
    mov ds, ax
    mov es, ax

    mov dx, offset mes1
    mov ah, 9
    int 21h  ;output mes1

    inc ah
    mov dx, offset str1
    int 21h


    mov ah, 9
    mov dx, offset str1+1 
    int 21h  

    mov ax, 4c00h
    int 21h
    end start


вот если я хочу вывести mes1 то делаю mov dx, offset mes1 и вызываю ф-ю вывода на экран и все работает. Думаю, по аналогии должно работать и в случае когда в dx хранится смещение на только что введенную строку, но не работает. Возможно проблема в том что нет нулевого завершителя в конце введенной строки, пробовал перед помещением в dx делать так: mov str1[4],'$', в этом случае было больше похоже на правду но все равно работало неправильно Ж(((


PM MAIL   Вверх
airyashov
Дата 11.1.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если совсем туго тогда объявите так:
Код

str1 db 10,0, 11 dup (0),'$'



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

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

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


 




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


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

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