Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 441
от 07.05.2006, 09:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 326, Экспертов: 26
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное