Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [ASM] работа со строкой 
:(
    Опции темы
DeathKnight
Дата 25.2.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть такое вот задание:
Код

Написать программу на ассемблере, выполняющую операции над строкой 
символов согласно заданиям, приведенным ниже. Общие требования: 
-- выделить буфер для хранения 200 символов; 
-- строку символов ввести с клавиатуры; 
-- ввод строки символов может быть завершен клавишей «Enter» или по 
заполнению буфера; 
-- дополнительный буфер для хранения промежуточных результатов обработки 
строки не вводить; 
-- константы задать с помощью директивы EQU; 
-- старт программы, ввод – вывод данных и обработку ошибок оформлять 
выводом в консоли поясняющих строк. 

Код

Вставить во всех строках текста слово "number" перед словами, состоящими из цифр. 


нужна помощь в начинании изучения асма, так как в универе дали только задания.
если можно, небольшой пример с комментариями. буду очень благодарен.
PM   Вверх
ИванМ
Дата 25.2.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



DeathKnight, под MS DOS или Windows Console?
PM MAIL   Вверх
DeathKnight
Дата 26.2.2010, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



эм... отличия есть значит.
вообще под 8086 процессор задания идут. нашел эмулятор emu8086, буду его ковырять. получается под дос.
в принципе не особо важно под что, там может разберусь)
PM   Вверх
DeathKnight
Дата 26.2.2010, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нужна хотя бы подсказка как реализовать проверку двойного условия.
и еще один вопрос: выделение дополнительной памяти, как с ним быть?
PM   Вверх
ИванМ
Дата 27.2.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(DeathKnight @  26.2.2010,  21:35 Найти цитируемый пост)
нужна хотя бы подсказка как реализовать проверку двойного условия.

два раза cmp пишешь и нужные переходы вот тебе двойное условие
можно еще макросредствами пользоваться (.IF)
на счет выделения дополнительной памяти, то она вроде здесь не нужна.
в общем посмотри, что  у меня пока получилось (tasm):

Код

locals
DOSSEG
.model small

.stack 100h

.data
len    db 200
res db 0
string  db 200 dup('$')
number    db 'number$'

.code
shift    proc    near
cld
mov        di, si
xor        cx, cx
@@1:
mov        bl, byte ptr [si]
cmp        bl, '$'
je        @@2
inc        cx
inc        si
jmp        @@1
@@2:
inc        cx
mov        di, si
add        di, 6
@@3:
mov        bl, byte ptr [si]
mov        byte ptr [di], bl
dec        si
dec        di
loop    @@3

ret
shift    endp

copy    proc near
cld
lea        si, number
mov        cx, 6
rep        movsb
ret
copy    endp

find    proc near
mov        di, si
mov        bl, 1
@@start:
mov        ah, byte ptr[si]
cmp        ah, 13
je        @@4
cmp        ah, ' '
je        @@1
jmp        @@3
@@1:
cmp        bl, 1
je        @@2
mov        bl, 1
inc        si
mov        di, si
jmp        @@3
@@2:
mov        ax, di 
ret
@@4:
cmp        bl, 1
je        @@2
mov        ax, 0
ret
@@3:
mov        ah, byte ptr[si]
cmp        ah, '0'
jl        @@5
cmp        ah, '9'
jg        @@5
inc        si
jmp        @@start
@@5:
mov        bl, 0
inc        si
jmp        @@start
find    endp

newline    proc    near
mov        dl,10
mov        ah,2
int        21h
ret
newline endp

input proc near
mov        ah, 0Ah
int        21h
ret
input endp

output proc near
mov        ah, 9
int        21h
ret
output endp

do    proc near
lea        si, string
@@1:
push    si
call    find
pop        si
cmp        ax, 0
je        @@2
mov        si, di
push    di
call    shift
pop        di
call    copy
lea        si, string
jmp        @@1
@@2:
ret
do    endp

start   proc    near
mov        ax, @data
mov        ds, ax
mov        es, ax
xor        ax, ax

mov        dx, offset len
call    input

call    do

call    newline

mov        dx, offset string
call    output

mov        ah, 0
int        16h

mov        ah, 4Ch
mov        al, 0
int    21h

start   endp

end     start


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


Шустрый
*


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

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



спасибо, буду разбираться.
PM   Вверх
ИванМ
Дата 27.2.2010, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



пока я сделал что слова должны обязательно разделяться одним пробелом
PM MAIL   Вверх
DeathKnight
Дата 27.2.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ИванМ, добавь, если не сложно, немного комментов. буду благодарен.
PM   Вверх
ИванМ
Дата 27.2.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Код

locals
DOSSEG
.model small

.stack 100h

.data
;длина строки
len    db 200
;резервный байт (для чтения)
res db 0
;сама строка
string  db 200 dup('$')
;строка 'number' с '$' на конце - определяет конец строки
number    db 'number$'

.code
;процедура сдвига строки на 6 байтов вправа (для того чтобы вставить на жто место 'number')
;в si - адрес строки с нужного места
shift    proc    near
cld
mov        di, si
xor        cx, cx
@@1:
mov        bl, byte ptr [si]
cmp        bl, '$'
je        @@2
inc        cx
inc        si
jmp        @@1
@@2:
inc        cx
mov        di, si
add        di, 6
@@3:
mov        bl, byte ptr [si]
mov        byte ptr [di], bl
dec        si
dec        di
loop    @@3

ret
shift    endp

;процедура копирования 'number' в строку
;в di - адрес строки с нужного места
copy    proc near
cld
lea        si, number
mov        cx, 6
rep        movsb
ret
copy    endp

;поиск числа
;в si - адрес строки с нужного места
find    proc near
mov        di, si
mov        bl, 1
@@start:
mov        ah, byte ptr[si]
cmp        ah, 13
je        @@4
cmp        ah, ' '
je        @@1
jmp        @@3
@@1:
cmp        bl, 1
je        @@2
mov        bl, 1
inc        si
mov        di, si
jmp        @@3
@@2:
mov        ax, di 
ret
@@4:
cmp        bl, 1
je        @@2
mov        ax, 0
ret
@@3:
mov        ah, byte ptr[si]
cmp        ah, '0'
jl        @@5
cmp        ah, '9'
jg        @@5
inc        si
jmp        @@start
@@5:
mov        bl, 0
inc        si
jmp        @@start
find    endp

;переход на новую линию
newline    proc    near
mov        dl,10
mov        ah,2
int        21h
ret
newline endp

;ввод строки
input proc near
mov        ah, 0Ah
int        21h
ret
input endp

;вывод строки
output proc near
mov        ah, 9
int        21h
ret
output endp

;основной алгоритм
do    proc near
;в si - адрес строки
lea        si, string
@@1:
push    si
;вызываем функцию find - ищем первую позицию числа
call    find
pop        si
;сравниваем ax с 0 (ax - возвращаемое значение функции find)
;если ноль - завершаем операцию
cmp        ax, 0
je        @@2
;иначе:
mov        si, di
;сдвигаем строку с позиции ax на 6 символов вправа (с помощью функции shift)
push    di
call    shift
pop        di
;копируем 'number' в нужную часть строки
call    copy
;в si - адрес строки
lea        si, string
;начинаем сначала
jmp        @@1
@@2:
ret
do    endp

;главная функция (точка входа)
start   proc    near
mov        ax, @data
mov        ds, ax
mov        es, ax
xor        ax, ax

;ввод строки
mov        dx, offset len
call    input

;основной алгоритм
call    do

;переход на новую строку
call    newline

;вывод полученной строки
mov        dx, offset string
call    output

;ожидание ввода символа
mov        ah, 0
int        16h

;завершение программы
mov        ah, 4Ch
mov        al, 0
int    21h

start   endp

end     start


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


Шустрый
*


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

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



спасибо. надеюсь разберусь)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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