Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизНе понимаю в чем ошибка на аsm-е Найти похожие ветки
← →
TankMan © (2005-01-13 13:30) [0]Вот решил написать поиск файлов на азме в Дельфи (от безделия)
Но тут же наткнулся на проблему :(
Вот вобщем кусочек процедуры..
Procedure Scan (dir,Dir2:PChar);
var
hSearch :DWORD;
fnbuff:array [0..MAX_PATH] of BYTE;
nfnbuff:array [0..MAX_PATH] of BYTE;
buff:array [0..MAX_PATH] of BYTE;
asm
push eax
push edx
push ecx
push edi
push esi
push Dir {содержит например "c:\"}
push fnbuff
call lstrcpy
push fns
push Dir2 {содержит Dir+"*.*" т.е. "c:\*.*"}
call FindFirstFile
cmp eax,INVALID_HANDLE_VALUE
jz @Exit
mov hSearch, eax
.........
@Exit:
pop esi
pop edi
pop ecx
pop edx
pop eax
end;
Вызываю ее так
Dir:=PChar(edit1.text);
Dir2:=PChar(Dir+"*.*");
Scan(Dir,Dir2);
Самое интересное что вот в процедуру lstrcpy Dir передается нормально, а вот вот Dir2 почему-то не хочет :( не понимаю...
Скажите еще чего не рассказал - уточню...
← →
Digitman © (2005-01-13 14:01) [1]
> от безделия
начнем с малого - "от безделия" разберись, на кой шут ты делаешь push/pop РОН eax/ecx/edx .. в Делфи-док-ции сказано, что сохранять/восстанавливать содержимое этих РОН как минимум бессмысленно.
в упомянутом тобой в декларации ф-ции Scan() дифолт-соглашении о вызове факт.параметр Dir будет передан в регистре eax, Dir2 - в edx .. пляши отсюда ..
← →
nicesc (2005-01-13 15:45) [2]push eax
push edx
push ecx
Сохранять не имеет смысла, остальные необходимо!
как только ты используешь var
у тебя компилятор создаёт на входе в ф-ию
PUSH EBP
MOV EBP,ESP
в конце соответственно добавляет, т.к. что лучше не использовать вообще если дорожишь скоростью и объёмом
Вот, читай брат и просвещайся:
h_tp://podgoretsky.com/ftp/Docs/Delphi/basm/basmru.zip
← →
Digitman © (2005-01-13 16:56) [3]
> как только ты используешь var
ты это Пушкину скажи, АсСергейчу .. а то я не знаю)..
← →
nicesc (2005-01-13 17:04) [4]Digitman
А это я не тебе ;)
← →
TankMan © (2005-01-14 06:36) [5]Спасибо - просвя(е)тили.
Дело в том что было дело (давнооо), когда я вставку делал ассемблерную - просто нужно было что-то сделать посреди функции коммандами asm-а, так вот пока я не вставил эти вот push eax push edx push ecx push edi push esi в начале и в конце их pop-ы, у меня почему-то вылетала программа, именно на той функции, которая содержала (единственную во всей программе) ассемблерную вставку.. вот я и запомнил почему-то с тех пор :), ну теперь буду знать :)
>в упомянутом тобой в декларации ф-ции Scan() дифолт-соглашении о вызове факт.параметр
Ух ты а я и забыл совсем...
Так это что получается, после вызова lstrcpy меняется edx и я теряю свой Dir2?
← →
VMcL © (2005-01-14 07:55) [6]>>TankMan © (14.01.05 06:36) [5]
Может, прежде, чем использовать BASM, имеет смысл справку почитать, а?
Register use
In general, the rules of register use in an asm statement are the same as those of an external procedure or function. An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers. On entry to an asm statement, BP points to the current stack frame, SP points to the top of the stack, SS contains the segment address of the stack segment, and DS contains the segment address of the data segment. Except for ESP and EBP, an asm statement can assume nothing about register contents on entry to the statement.
← →
Digitman © (2005-01-14 08:39) [7]
> Так это что получается, после вызова lstrcpy меняется edx
> и я теряю свой Dir2?
именно так и получается
см.
> VMcL © (14.01.05 07:55) [6]
← →
TankMan © (2005-01-14 11:07) [8]>>VMcL
Не знал что там и про это напишут.. действительно :)
А вот еще хотел спросить а нет ли случайно конвертера или еще чего(другого способа), переделать в basm исходники написаные для masm-? (или где там вызываются процедуры как invoke DialogBoxParam, hInstance, ADDR AppName, NULL, addr DlgProc, NULL) а не с push-ами? Такто ручками не сложно - просто исходники есть большие достаточно...
← →
nicesc (2005-01-14 14:22) [9]TankMan
Ну и напиши сам :)
← →
TankMan © (2005-01-14 15:51) [10]Ну вообще я думаю несложно (я не вижу никаких заморочек (с первого взгляда)), но проблема в том что я знаю ассемблер почти на уровне сложения и вычитания... Зачем писать велосипед (изобретать колесо)? Ну должна же быть такая :) Или всетаки нет?
← →
Digitman © (2005-01-14 16:20) [11]
> TankMan © (14.01.05 15:51) [10]
> знаю ассемблер
> почти на уровне сложения и вычитания
ассемблер нельзя знать "на уровне".
либо ты его знаешь , либо не знаешь.
причем речь идет как миниму о конкретном процессоре, и уже во 2-ю очередь - о компилирующей среде.
← →
Anatoly Podgoretsky © (2005-01-14 16:25) [12]Ассемблер вообще не обязательно знать, достаточно рядом иметь списко его команд. Знать надо архитектуру процессора.
← →
TankMan © (2005-01-14 22:17) [13]>Anatoly Podgoretsky
Вот.. правильно, можно сказать так, что у меня НЕТ списка его комманд :), поэтому я немогу написать конвертер...
А архитектура процессоров какминимум сейчас/мне не важна, не будуже я на Маках программировать, а у Интела и АМД архитектура (на уровне программирования)... ну если не идентичная, то очень бликая к идентичной - это ИМХО.
З.Ы. Так и всетаки - люди! скажите есть такой конвертер или не может быть в природе, и эта принципиальная простота устройства подобного конвертера которую я вижу - всего лишь иллюзия?
← →
Anatoly Podgoretsky © (2005-01-15 00:11) [14]Список всех команд и их синтаксис есть на сайте Интел, если не хочешь там искать (уж больно много информации), то можешь взять на моем сайте. Если ты не знаком с архитектурой то ты вообще не сможешь программировать.
← →
TankMan © (2005-01-15 08:30) [15]Спасибо за информацию.. :) буду смотреть.
http://www.podgoretsky.com/asm.html Тут?
← →
TankMan © (2005-01-15 09:18) [16]>>Anatoly Podgoretsky
З.ы. Я тут наткнулся у вас (на сайте) на ссылки для скачивания электронных версий книг разнообразных, но вот ссылки оказались битые - вы не могли бы подсказать, где можно еще скачать книги по CorelDraw 12 PhotoShop CS и 3DMax 6-му?
← →
Kerk © (2005-01-15 09:26) [17]TankMan © (14.01.05 22:17) [13]
иллюзия. задача немножко проще, чем написание компилятора.
← →
Anatoly Podgoretsky © (2005-01-15 14:33) [18]TankMan © (15.01.05 09:18) [16]
Исправлено
← →
TankMan © (2005-01-15 21:20) [19]>>Anatoly Podgoretsky
Благодарю! Буду качать.
>>Kerk
Значит будем ручками :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c