![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объединение строк в ASM
Gydvin © (2006-02-25 20:26:00)Здравствуйте мастера, тут короче ассемблер начал ковырять, ну и возникла небольшая проблемка.
короче
в двух регистрах находся по слову, например
eax = 'Hello'
edx = 'world'
как бы мне в eax или еще где, получить 'Hello world'.
чур только больно небить.
Зы. Может есть линки, на литературу по ASM для начинающих, где б доступным языком были б описаны основы.
Сергей М. (2006-02-27 14:27:00) [1]
> Gydvin © (27.02.06 14:21) [25]
Творческих тебе узбеков !)
Gydvin (2006-02-27 14:21:00) [2]ответственен за ее аллокацию/реаллокацию/освобождение
Мдяя тяжелый случай, ну да ладно как нибуть разберусь
Сергей М. (2006-02-27 14:11:00) [3]
> Gydvin © (27.02.06 13:59) [23]
Т.е. речи о Делфи вообще не идет ?
Ну тогда ты должен определиться, где и как распределяется память под результат и кто (вызываемая или вызывающая подпрограмма) ответственен за ее аллокацию/реаллокацию/освобождение, если речь идет о динамической памяти.
Gydvin (2006-02-27 13:59:00) [4]Сергей М. © (27.02.06 13:52) [22]
короче ехе открываешь отладчиком со встроеным дизасемблером и там дорисовываешь все что тебе нужно, так же там имеется возможность сохранить результат работы непосредственно в исполняемый файл.
Сергей М. (2006-02-27 13:52:00) [5]
> который сохраняю ... в ехе
А я где по-твоему сохраняю ?
> переменые как result, bufer и т.п неканают
Result в дан.контексте - это не переменная, это зарезервированное слово, под которым компилятором подразумевается адрес области памяти, имеющей структуру AnsyString, которую компилятор динамически распределил перед вызовом ф-ции для возврата результата конкатенации.
И что вообще значит "неканают" ?
> жесткой адресацией бр
Что подразумевается под этим ?
Gydvin (2006-02-27 13:38:00) [6]mov eax, Result
В том то и дело что я пишу в памяти который сохраняю (если меня устраивает результат) в ехе и потому там такие переменые как result, bufer и т.п неканают, а то б было гораздо проще, а еще с жесткой адресацией бр.
Gydvin (2006-02-27 13:34:00) [7]Если я правильно понял [6], то там в eax находится результат работы и чтоб я его мог использовать из другой процедуры я должен положить их на какой либо глобальный адрес, предварительно его создав
Сергей М. (2006-02-27 13:30:00) [8]
> Defunct © (27.02.06 13:03) [16]
> там не ссылка возвращается, а непосредственные данные через
> eax
Ага, вижу уже ..
> Gydvin © (27.02.06 13:03) [17]
> а как надо, можно напримере если не тяжело
Сначала ты должен определиться с типом результата.
Пример:
function ConcatenateTwoStrings(const Str1, Str2: String): String;
//эквивалентно Паскаль-строке Result := Str1 + Str2;
asm
push eax
push edx
mov eax, Result
pop ecx
pop edx
call System.@LStrCat3
end;
Defunct (2006-02-27 13:17:00) [9]> можно напримере если не тяжело
напр. так:
sub esp, 50
call GetString
; после этого вызова в стеке по адресы [esp] будет лежать строка
; где первый байт - длина - далее символы латинского алфавита..
...
; ---> зарезервированное место под рез-тат в стеке
; <--- строка в выделенной области памяти (первый байт - длина)
GetString:
push ebp
mov ebp, esp
mov ecx, 'z'-'a'+1 ; будем выводить лат. алфавит
mov [ebp+8], cl ; длину будущей строки знаем и сразу заносим в первый байт строки
mov al, 'z' ; строку заполняем с конца
_do_fill_str:
mov [ebp + ecx + 9], al ; сохраняем тек. символ
dec eax ; код будет эффективнее чем dec al
loop _do_fill_str
pop ebp
ret
Gydvin (2006-02-27 13:03:00) [10]Сергей М. © (27.02.06 12:54) [15]
Хм, а как надо, можно напримере если не тяжело
Defunct (2006-02-27 13:03:00) [11]там не ссылка возвращается, а непосредственные данные через eax..
а причина глюка с выходом была в том, что по [ebp] находится адрес возврата, и он затирался командами stosb, т.к. edi = ebp...
если надо возвращать строку, то память нужно выделять перед вызовом функции, тогда действительно надо будет делать манипуляцию с ebp (и работать с данными [ebp + смещение]
Сергей М. (2006-02-27 12:54:00) [12]
> все работает
Возвращать результат по ссылке на область стека, нач.адрес которой < esp, нельзя - результат будет непредсказуем.
Сергей М. (2006-02-27 12:51:00) [13]
> теперь при выходе таже ошибка
Ну ты стек-то сбалансировал перед RET !
Поэтому и ошибка ..
Кр.того, все та же ошибка : вместо
mov edi, esp
ты опять пишешь
mov edi, ebp
Gydvin (2006-02-27 12:50:00) [14]Defunct © (27.02.06 12:02) [6]
Большое спасибо, все работает
Сергей М. (2006-02-27 12:46:00) [15]
> Defunct © (27.02.06 12:34) [8]
Да я собственно не против ... просто поинтересовался ..
Gydvin (2006-02-27 12:42:00) [16]Сергей М. © (27.02.06 12:29) [7]
Ну воперевых [8], а во вторых дописываю функционал, для одной очень для меня интересной, но старой проги, а аналогов я для нее пока не нашел :(
Gydvin (2006-02-27 12:38:00) [17]Gydvin © (27.02.06 12:36) [9]
ой не видел остальные посты
Gydvin (2006-02-27 12:36:00) [18]делаю так
PUSH EBP
MOV EBP,ESP
SUB ESP,50
MOV AL,61
MOV EDI,EBP
STOS BYTE PTR ES:[EDI]
MOV AL,62
STOS BYTE PTR ES:[EDI]
MOV AL,63
STOS BYTE PTR ES:[EDI]
MOV EAX,DWORD PTR SS:[EBP]
add ESP,50
POP EBP
RETN ; теперь при выходе таже ошибка
Defunct (2006-02-27 12:34:00) [19]Сергей М. © (27.02.06 12:29) [7]
Человек изучает асм, что в этом плохого? Причем тут сомнения относительно кода генерируемого компилятором с паскаля?
Сергей М. (2006-02-27 12:29:00) [20]
> Gydvin
А в чем прелесть реализации всего этого на asm'е ?
Ты сомневаешься в эффективности соответствующего кода, генерируемого компилятором для того же алгоритма, но на Паскале ?