Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объединение строк в ASM


Страницы:   1 2

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'е ?
Ты сомневаешься в эффективности соответствующего кода, генерируемого компилятором для того же алгоритма, но на Паскале ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо