· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› как склеить две строки?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 8, 2003 03:40:39

Допустим:

.data
mes1 db 'stroka1', 0
mes2 db 'stroka2', 0

как их склеить, чтобы вывести на экран 'stroka1stroka2'

а?


Дата: Сен 8, 2003 04:12:37

В твоем случае - убрать ноль :)


Дата: Сен 8, 2003 05:03:49

volodya
:-)))
Ему программным путём надо ;-)


Дата: Сен 8, 2003 05:10:18

Все стандартные алгоритмы (вроде тех, что реализованы в strcpy) предполагают наличие достаточного места в строке. Если это не так, тогда надо вычислить длину добавляемой строки, добавить память, занимаемую массивом и дописать ее туда. А вообще, для таких случаев есть книжка Рендалла Хайда! Давным-давно лежит!

KINDER - занеси это в FAQ.


Дата: Сен 8, 2003 06:51:06

volodya, спасиб. Качаю книжку... :)

Asterix, ну чего ты зубоскалишься, жеребец? Мурзилку может обидеть каждый...


Дата: Сен 8, 2003 07:05:24

murzilka

:-))) Это предназначалось для Володи, так что не понимаю упрёка.
У Вас, молодой человек, не всё в порядке с головой..


Дата: Сен 8, 2003 07:19:58

mov esi,OFFSET mes2
mov edi,OFFSET [mes2 - 1]
movsd
movsd
invoke MessageBox,0,OFFSET mes1,0,0


Дата: Сен 8, 2003 12:49:56 · Поправил: KiNDeR

занеси это в FAQ.
volodya уже сделано...
К следущему посту(я думаю он будет в четверг) все будет готово.


Дата: Сен 8, 2003 16:11:24

Посмотри набор строковых макросов от Four-F - там дофига приблуд для wsprintf и т.д., спасибо автору. Лежит на wasm.


Дата: Сен 8, 2003 16:52:36

Пожалуйста. Только при чем тут склеивание строк?


Дата: Сен 8, 2003 17:14:45

Four-F

Если соврал - и для случая, когда

.data
mes1 db 'stroka1', 0
mes2 db 'stroka2', 0

там ничего нет, прошу прощенья, но
если сразу надо вствить "stroka1", я подсел на Strings.mac, благодарен и всем рекомендую.
Использование исключительно некоммерческое


Дата: Сен 8, 2003 17:46:30 · Поправил: BaldakBatur

но надо не изменяя данных..
 mov edi,esp
 mov eax,[esp]
 sub edi,800h ;не знаю сколь велик стек..
 mov eax,edi

 mov esi,offset mes1
 mov ecx,7 ;длина 1-й строки
 rep movsb
 mov esi,offset mes2
 mov ecx,8 ;длина 2-й строки+нуль
 rep movsb
 invoke MessageBox,0,eax,0,0


Дата: Сен 9, 2003 01:50:10

Большое спасибо за советы. Особенно BaldakBatur`у :).


Asterix, шел бы ты работать языком в другом месте, как говорил товарищ Черномырдин. Для чего ты залез в этот топик? Позубоскалить и поострить? У тебя это плохо получается...


Дата: Сен 9, 2003 01:51:08 · Поправил: Sk. Inc.

Попробуй этот способ:
 
invoke	lstrlen, offset mes1		; получаем длину первой строки
push	eax				; кладем значение длины в стек
invoke	lstrlen, offset mes2		; получаем длину второй строки
pop	ecx				; извлекаем из стека значение длины первой строки
add	ecx, eax			; складываем длины строк
inc	ecx				; не забываем нуль-символ ;)
invoke	LocalAlloc,LMEM_FIXED,ecx	; выделяем под строку память
invoke	lstrcpy, eax, offset mes1	; копируем строку 1 в память
invoke	lstrcat, ecx, offset mes2	; приклеиваем строку 2 к строке 1

в результате в регистре eax у нас содержится адрес полученной строки, который, когда он станет уже ненужным, передается в качестве параметра функции LocalFree, для освобождения памяти


Дата: Сен 10, 2003 01:48:56

Sk. Inc, спасибо огроменное! Для меня, человека программившего только на ПХП и только-только начавшего изучать АСМ, такие советы с комментариями на каждую инструкцию просто спасение :).

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.100