Вопрос № 41847: Здравствуйте, уважаемые эксперты. Можно ли в ассемблере присваивать строке значение в реальном времени, т.е.
...
lea DI, String
lea SI, 'stroka'
movs...
???
Можно ли делать конкатенацию строк? Если можно, то как?...
Вопрос № 41.847
Здравствуйте, уважаемые эксперты. Можно ли в ассемблере присваивать строке значение в реальном времени, т.е.
...
lea DI, String
lea SI, 'stroka'
movs...
???
Можно ли делать конкатенацию строк? Если можно, то как?
Отправлен: 02.05.2006, 08:38
Вопрос задал: AxeL (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Mihasic
Здравствуйте, AxeL!
Смотря как у вас в программе объявлены строки. Если строка, например, это последовательность байт, которая заканчивается нулевым символом (ASCIIZ), то вполне можно произвести конкатенацию строк и не только, главное, чтобы буфера было достаточно, чтобы поместить результирующую строку.
Приложение:
Ответ отправил: Mihasic (статус: 1-ый класс)
Ответ отправлен: 02.05.2006, 09:27
Отвечает: Sergijj
Здравствуйте, AxeL!
Дело в том, что в assembler'е нету понятия "строка":
lea di, String ; Присваивание DI указателя на начало String
lea di, 'stroka'; Присваивание DI указателя на _константу_...;) Так нельзя.
Конкатенация возможна:
1. Буфер приёмника должен быть = "длина приёмника" + "длина дополнения".
2. Копируешь (rep movsb или rep movsw) строку "дополнение" по адресу нуль-терминатора строки "приёмник".
3. Ставишь в конце нуль-терминатор.
Это для asciiz-строк.
На всякий случай поясняю, ASCIIZ-строка - это массив символов (байт), ограниченный в конце символом "0" (нуль), который и называется "терминатором" строки, а точнее "нуль-терминатором", ибо если используешь только самописный код, то терминатор можешь поставить любой...:-)
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 3-ий класс)
Ответ отправлен: 02.05.2006, 15:33
Отвечает: Пан Павел Константинович
Здравствуйте, AxeL!
> Здравствуйте, уважаемые эксперты. Можно ли в ассемблере присваивать строке значение в реальном времени?
>> Вопрос понел смутно, НО! попробую ответить вам. Относитель того кода котрый вы превели в пример могу сказать:
1-ая догадка.
lea si,Label - команда для загрузки эффективного адреса(Load Effectiv Adress) в регистр т.е. загрузка в регистр смещения Метки. строка lea si,'stroka' очень заманчива т.е. вы хотите сразу занести в регистр смещение, без упоминания метки, конечно это красиво НО! есть специфика языка которой мы должны предерживаться. Я откомпилировал ваш вариант и получил Ошибку, жаль. Может уже существуют компиляторы которые позволяют это делать.
2-ая догадка.
У нас имеется строка вида:
Str db 'Hello World'
Теперь присваиваем этой строке другую строку. НО! для начала давайте определим понятие строки в C/C++, строка это область памяти(Буфер) в которой содержатся символы и самым последним символом является символ с кодом 0 или Главное из этого, что строка это Буфер.
Вот код который заносит в строку другую строку которая будет введена в реальном времени:
CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
mov ah,0ah ;Фун-ия для записи в буфер(строку)
lea dx,Max ;Смещение для работы с буфером(строкой)
int 21h ;21-ое прерывание
ret ;Exit
MAX db 10 ;Колл-во Максимально вводимых символов.
LEN db ? ;Длинна занесенных данных
String db 'Hello World' ;Строка в которую будут занесены данные
CSEG ends
end Begin
СОВЕТ: Запустите это под отладчиком.
> Можно ли делать конкатенацию строк? Если можно, то как?
>> Да, конечно можно НО! только я что-то не нашел подходящию фун-ию типа char* strcat(target, source) C++ в библиотеках BIOS и DOS. Иногда пустота превращается в знания и навыки.
Давайте писать свою фун-ию:
1. Надо знать команды работы со строками языка Ассемблер.
2. Посмотреть работу функции char* strcat(target, source) C++.
3. Выделить из наблюдения алгоритм действия функции char* strcat(target, source) C++
4. Посмотреть кретические ситуации, при работе с фун-ией char* strcat(target, source), т.е. при каких услових применение фун-ии char* strcat(target, source), ведёт к краху программы.
5. Создать программу на языке С/С++ похожую на фун-ию char* strcat(target, source).
6. Повторить алгоритм фун-ии char* strcat(target, source), на языке Ассемблер.
Я сейчас "поиздевался" над char* strcat(target, source) Borland C++ 5.02, советую и вам ОЧЕНЬ увлекательный процесс.
Извените! что не написал фун-ию конкатенации на Ассемблере.
СОВЕТ: Когда будете писать алгоритм конкатенации применяйте строки формата:
LEN db 5 ;длинна строки
String db 'Hello' ;строка
С, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 02.05.2006, 20:47