Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Объединение строк в ASM   Найти похожие ветки 

 
Gydvin ©   (2006-02-25 20:26) [0]

Здравствуйте мастера, тут короче ассемблер начал ковырять, ну и возникла небольшая проблемка.

короче
в двух регистрах находся по слову, например
eax  =  "Hello"
edx = "world"
как бы мне в eax или еще где, получить "Hello world".

чур только больно небить.

Зы. Может есть линки, на литературу по ASM для начинающих, где б доступным языком были б описаны основы.


 
Defunct ©   (2006-02-25 20:50) [1]

ну во превых, в регистрах слов быть не может, в регистрах указатель на строку...

Чтобы строки можно воспользоваться строковыми командами: movs, lods, stos. Только необходимо выделить память под третью строку, куда будет помещен результат объединения строк.

> Зы. Может есть линки, на литературу по ASM для начинающих,
Лучше купить книгу..


 
Gydvin ©   (2006-02-25 21:04) [2]

Defunct ©   (25.02.06 20:50) [1]
Лучше купить книгу..

Может какую конкретно посоветуете

movs, lods, stos
Ага понятно.

А вобще стоит такая задача:
Вот аналог в делфях

r:array of integer;
for x:=0 to 100 do begin

  if r[x]=0 then s:=s+"0" else s:=s+"1";
end;

где "1" и "0" хранится по некому адресу

я уже со всем разобрался вот только проблемы с s:=s+


 
Defunct ©   (2006-02-25 21:11) [3]

> Может какую конкретно посоветуете
Новых книг для начинающих - не знаю, из старых - "Ассемблер для IBM PC и программирования", П. Абель.

> я уже со всем разобрался вот только проблемы с s:=s+
ну например так:

 mov  al, <символ который надо добавить к строке>
 mov  edi, <адрес строки + текущая длина строки >
 stosb  // <добавление символа в конец строки и автоинкремент edi >
 
только память под строку должна быть выделена с запасом!


 
Gydvin ©   (2006-02-27 11:50) [4]

что-то немогу вьехать что я тут неправильно сделал

PUSH EBP
MOV EBP,ESP
SUB ESP,50 ; резервирую место в стеке
MOV AL,61    ; Символ "a"
MOV EDI,DWORD PTR DS:[ebp-50]
STOS BYTE PTR ES:[EDI] ; уже здесь  "Ошибка записи по адресу 00000000"
STOS BYTE PTR ES:[EDI]
STOS BYTE PTR ES:[EDI]
MOV EAX,DWORD PTR DS:[ebp-50]
LEAVE
RETN


 
Defunct ©   (2006-02-27 11:58) [5]

Ну дык понятно, а что ж вы хотели?

push  ebp
mov   ebp, esp   ; <-- ebp указывает на вершину стека (начало строки)
sub    esp, 50
mov   al, "a"
mov   edi, ebp ; адрес начала строки
stosb
stosb
stosb
mov  eax, [ebp]   ; не надо адресовать ds через ebp, оставьте ss для ebp
add  esp, 50       ; восстановить указатель стека!!
ret


 
Defunct ©   (2006-02-27 12:02) [6]

zzz теперь уже я гоню, насмотревшись на ваш код.. извиняюсь.

sub   esp, 50    
mov   edi, esp   ; адрес начала строки
mov   al, "a"
stosb
stosb
stosb
mov   eax, [esp]  
add  esp, 50       ; восстановить указатель стека
ret


 
Сергей М. ©   (2006-02-27 12:29) [7]


> Gydvin


А в чем прелесть реализации всего этого на asm"е ?
Ты сомневаешься в эффективности соответствующего кода, генерируемого компилятором для того же алгоритма, но на Паскале ?


 
Defunct ©   (2006-02-27 12:34) [8]

Сергей М. ©   (27.02.06 12:29) [7]

Человек изучает асм, что в этом плохого? Причем тут сомнения относительно кода генерируемого компилятором с паскаля?


 
Gydvin ©   (2006-02-27 12:36) [9]

делаю так

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 ; теперь при выходе таже ошибка


 
Gydvin ©   (2006-02-27 12:38) [10]

Gydvin ©   (27.02.06 12:36) [9]

ой не видел остальные посты


 
Gydvin ©   (2006-02-27 12:42) [11]

Сергей М. ©   (27.02.06 12:29) [7]

Ну воперевых [8], а во вторых дописываю функционал, для одной очень для меня интересной, но старой проги, а аналогов я для нее пока не нашел :(


 
Сергей М. ©   (2006-02-27 12:46) [12]


> Defunct ©   (27.02.06 12:34) [8]


Да я собственно не против ... просто поинтересовался ..


 
Gydvin ©   (2006-02-27 12:50) [13]

Defunct ©   (27.02.06 12:02) [6]

Большое спасибо, все работает


 
Сергей М. ©   (2006-02-27 12:51) [14]


> теперь при выходе таже ошибка


Ну ты стек-то сбалансировал перед RET !
Поэтому и ошибка ..

Кр.того, все та же ошибка : вместо
mov edi, esp
ты опять пишешь
mov edi, ebp


 
Сергей М. ©   (2006-02-27 12:54) [15]


> все работает


Возвращать результат по ссылке на область стека, нач.адрес которой < esp, нельзя - результат будет непредсказуем.


 
Defunct ©   (2006-02-27 13:03) [16]

там не ссылка возвращается, а непосредственные данные через eax..

а причина глюка с выходом была в том, что по [ebp] находится адрес возврата, и он затирался командами stosb, т.к. edi = ebp...

если надо возвращать строку, то память нужно выделять перед вызовом функции, тогда действительно надо будет делать манипуляцию с ebp (и работать с данными [ebp + смещение]


 
Gydvin ©   (2006-02-27 13:03) [17]

Сергей М. ©   (27.02.06 12:54) [15]

Хм, а как надо, можно напримере если не тяжело


 
Defunct ©   (2006-02-27 13:17) [18]

> можно напримере если не тяжело

напр. так:

 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


 
Сергей М. ©   (2006-02-27 13:30) [19]


> 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;


 
Gydvin ©   (2006-02-27 13:34) [20]

Если я правильно понял [6], то там в eax находится результат работы и чтоб я его мог использовать из другой процедуры я должен положить их на какой либо глобальный адрес, предварительно его создав


 
Gydvin ©   (2006-02-27 13:38) [21]

mov eax, Result

В том то и дело что я пишу в памяти который сохраняю (если меня устраивает результат) в ехе и потому там такие переменые как result, bufer и т.п неканают, а то б было гораздо проще, а еще с жесткой адресацией бр.


 
Сергей М. ©   (2006-02-27 13:52) [22]


> который сохраняю ... в ехе


А я где по-твоему сохраняю ?


> переменые как result, bufer и т.п неканают


Result в дан.контексте - это не переменная, это зарезервированное слово, под которым компилятором подразумевается адрес области памяти, имеющей структуру AnsyString, которую компилятор динамически распределил перед вызовом ф-ции для возврата результата конкатенации.

И что вообще значит "неканают" ?


>  жесткой адресацией бр


Что подразумевается под этим ?


 
Gydvin ©   (2006-02-27 13:59) [23]

Сергей М. ©   (27.02.06 13:52) [22]

короче ехе открываешь отладчиком со встроеным дизасемблером и там дорисовываешь все что тебе нужно, так же там имеется возможность сохранить результат работы непосредственно в исполняемый файл.


 
Сергей М. ©   (2006-02-27 14:11) [24]


> Gydvin ©   (27.02.06 13:59) [23]


Т.е. речи о Делфи вообще не идет ?

Ну тогда ты должен определиться, где и как распределяется память под результат и кто (вызываемая или вызывающая подпрограмма) ответственен за ее аллокацию/реаллокацию/освобождение, если речь идет о динамической памяти.


 
Gydvin ©   (2006-02-27 14:21) [25]

ответственен за ее аллокацию/реаллокацию/освобождение

Мдяя тяжелый случай, ну да ладно как нибуть разберусь


 
Сергей М. ©   (2006-02-27 14:27) [26]


> Gydvin ©   (27.02.06 14:21) [25]


Творческих тебе узбеков !)



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
2-1140982178
WestBronx
2006-02-26 22:29
2006.03.12
Список файлов в папке


2-1140503578
Wood
2006-02-21 09:32
2006.03.12
Закрыть TExcelApplication без сохранения


3-1137372262
DimonS
2006-01-16 03:44
2006.03.12
Access +SQL


1-1139573384
DevBoy
2006-02-10 15:09
2006.03.12
Borland отказывается от дальнейшего развития Delphi!


15-1140170580
Ega23
2006-02-17 13:03
2006.03.12
С Днём рождения! 17 февраля