12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
1
TASM

Формирование строки из исходной путем заданного числа повторений исходной строки

20.11.2012, 22:25. Показов 1621. Ответов 7
Метки нет (Все метки)

Задание:
Написать программу формирования строки из исходной путем заданного числа повторений исходной строки.
В общем проблема в том, что я не особо понимаю, как работать со строками в асме. Вот то, что получилось. К сожалению проверить на своём ноуте не могу, 64-битная версия ОС и тасм отказывается с ней работать. Нет возможности ставить виртуалку только ради этого.
два вопроса по следующему коду:
1)Правильно ли он будет работать?Я ожидаю записи привета "7 раз".
2)Как вывести получившуюся строку? Я так понимаю тут необходимо это делать побитово?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
data segment
    str1 db 'privet$'
    str2 db 42 dup (?)
data ends
code segment
start:
assume cs:code, ds:data, es:data
    mov ax,data
    mov ds,ax
    mov cx,21
    mov si,0
    CLD
    lea di,str2
    lea si,str1
    rep movsw
    mov ax, 4c0h
    int 21h
code ends
end start
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2012, 22:25
Ответы с готовыми решениями:

Формирование строки из исходной путем заданного числа повторений исходной
Помогите, если можно! Надо написать программу для формирования строки из исходной путем заданного...

Формирование строки из исходной путем заданного числа повторений исходной строки
Помогите написать программу формирования строки из исходной путем заданного числа повторений...

Формирование строки из исходной путём заданного числа повторений исходной строки
Помогите пожалуйста написать программку формирования строки из исходной путём заданного числа...

Сжатие строки символов путем удаления пробелов из исходной строки
Помогите пожалуйста, нужен только текст кода программы ассемблера, а то с Англ.языком вообще плохо,...

7
Ушел с форума
Автор FAQ
15020 / 7216 / 896
Регистрация: 11.11.2010
Сообщений: 12,961
21.11.2012, 04:05 2
MoonGuard,
  • Как вывести получившуюся строку?
    Использовать функцию 9 прерывания 21h
  • Правильно ли он будет работать?
    нет не правильно, ошибки
    1) зачем mov si,0 если через строку lea si,str1
    2) чтобы работала команда rep movsw регистр ES должен быть равен DS, то есть после mov ds,ax нужна команда mov es,ax
    3) mov cx,21 приведет к копированию в строку str2 42 символов, но это в теории, на практике, когда закончится строка str1 (str1 db 'privet$') в которой 7 символов, начнет копироваться всё подряд из следующих адресов, в том числе, начнет затираться содержимое строки str2
    4) при выводе на экран, вывод закончится на первом встретившемся символе "$"
    5) для окончания программы используется функция 4Ch прерывания 21h, то есть или mov ax,4c00h/int 21h или mov ah,4ch/int 21h но не то что написано у тебя
1
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
21.11.2012, 09:31  [ТС] 3
Mikl___,
Странно, когда читал книгу Питер Абель - Язык ассамблер, то там как раз про копирование говорилось. Что в адресе будет расположено сначала 6 байт моей строки стр1, а за ней сразу будет расположен адрес стр2. Т.е. я за 3 цикла в стр2 перенесу стр1, а потом буду копировать уже из стр2(первое слово, т.е. 2 байта) в стр2 (в текущий конец, т.е. счетчик ди увеличивается ведь на +2 после каждого прохода). Я так кстати и не понял, почему строка начнёт затираться.
А насчёт вывода, я просто могу использовать это прерывание и оно выведет строку любой длинны, которая полезет в буфер?
Исправил код, относительно ваших замечаний, за что кстати спасибо ещё раз.
Текущая версия:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
data segment
    str1 db 'privet'
    str2 db 42 dup (?)
data ends
code segment
start:
assume cs:code, ds:data, es:data
    mov ax,data
    mov ds,ax
    mov es,ax
    CLD
    mov cx,21
    lea di,str2
    lea si,str1
    rep movsw
    
    mov ah,9
    lea dx,str2
    int 21h
    mov ax, 4c00h
    int 21h
code ends
end start
0
Ушел с форума
Автор FAQ
15020 / 7216 / 896
Регистрация: 11.11.2010
Сообщений: 12,961
21.11.2012, 10:00 4
MoonGuard, внимательно читай Абеля длина строки str1=6 символов, поэтому из нее 42 символа не скопировать, цель твоей программы скопировать эти 6 символов 3 раза в строку str2 это делается так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
mov cx,3; три внешних цикла
     lea di,str2; куда копируем
L1: push cx
     mov cx,6; внутренний цикл
     lea si,str1
     rep movsb
     pop cx
     loop L1
     mov byte ptr [di],'$'
     mov ah,9
     mov dx,offset str2
     int 21h; выводим на экран трижды повторенную строку str1
1
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
21.11.2012, 10:10  [ТС] 5
Хм...Спасибо.
Пару уточняющих вопросов:
Assembler
1
mov dx,offset str2
- это помещает в дх смещение строки стр2? т.е. фактический адрес, по которому наша стр2 расположена? Точнее откуда она начинается.
Assembler
1
mov byte ptr [di],'$'
- не совсем понимаю, что именно эта конструкция делает, точнее первая её часть. Интуитивно догадываюсь, что она записывает символ окончание строки в текущий адрес ди, т.е. в конец получившийся у нас строки?
0
Ушел с форума
Автор FAQ
15020 / 7216 / 896
Регистрация: 11.11.2010
Сообщений: 12,961
21.11.2012, 10:18 6
MoonGuard,
  1. это одно и тоже lea dx,str2 и mov dx,offset str2 просто длина последней команды на 1 байт короче
  2. mov byte ptr [di],'$' ограничит строку str2, без этого функцией 9 прерывания 21h будут выведены символы, начиная от адреса str2 до тех пор пока в памяти не встретится символ "$" попробуй без этого символа и посмотри, что получится
1
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
21.11.2012, 10:26  [ТС] 7
Mikl___, кстати а значение si постоянно увеличивается же, разве мы на втором цикле не выскочим уже за её пределы? Мы же нигде не восстанавливаем её значение.
0
Ушел с форума
Автор FAQ
15020 / 7216 / 896
Регистрация: 11.11.2010
Сообщений: 12,961
21.11.2012, 10:32 8
MoonGuard, размер SI увеличивается во внутреннем цикле от str1 до str1+6, с началом следующего цикла SI опять установлен на начало строки str1, и то же произойдет в начале третьего цикла, а вот DI один раз установлен на начало строки str2 и далее растет пока не закончится процесс копирования
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2012, 10:32

Формирование строки из тех же слов исходной строки в обратном порядке
Подскажите как подключить библиотеку, а то у меня не получается. Создал dll библиотеку, создал...

Преобразовать строку так, чтобы сначала в ней шли все цифры исходной строки, а потом – все буквы исходной строки, но в обратном порядке
1)Даны сведения о 8 фильмах: название, режиссер, страна, год выпуска, стоимость(расходы на выпуск),...

Матрицы. Создть новую матрицу путем удаления строки и столбца из исходной
Помогите до завтра пожалуйста! Написать программу, которая заполняет матрицу А(mxn) целыми...

Можно ли из исходной строки путём перестановки литер получить вторую строку?
3.Пусть даны две строки str1 и str2. Необходимо выяснить, можно ли из str1 путём перестановки литер...

Составить новую строку из всех гласных латинских букв исходной строки без повторений
доброго времени суток. прошу помоч знающих людей. вобщем задание такое.. есть строка, выбрать из...

Сформировать новую строку, которая будет содержать слова исходной строки без их повторений
Условие: Задана символьная строка, которая может содержать одинаковые слова, разделенные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru