Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];

Вниз

Asm вставка и паскалевские функции   Найти похожие ветки 

 
jonik pegas   (2002-05-23 10:16) [0]

Здравствуйте Мастера. Пытаюсь вызвать inttostr в asm процедуре-преобразовать значения int в строку. Вроде бы она register, но
на
mov eax,variable
call inttostr
сдедует ругань "Нарушение доступа к памяти и т.д"
Не помогает также и
mov eax,[variable]
call inttostr
и также попытки через стек (push eax)
В чем ошибка, как исправить?
И вдогонку еще вопрос-когда используются register соглашения каков порядок передачи аргументов?


 
Alx2   (2002-05-23 10:57) [1]

Рискну предположить, что затираешь значение регистра eax, которое потом используется где-то для базовой адресации.
можно попробовать в начале твоей asm вставки сделать push eax, а в конце, когда его значение не нужно - pop eax.

Хорошо бы посмотреть код твоей asm-процедуры. А то у нас ну очень кривой remote debug полчается :)

А вот порядок передачи:
Under the register convention, up to three parameters are passed in CPU registers, and the rest (if any) are passed on the stack. The parameters are passed in order of declaration (as with the pascal convention), and the first three parameters that qualify are passed in the EAX, EDX, and ECX registers, in that order. Real, method-pointer, variant, Int64, and structured types do not qualify as register parameters, but all other parameters do. If more than three parameters qualify as register parameters, the first three are passed in EAX, EDX, and ECX, and the remaining parameters are pushed onto the stack in order of declaration. For example, given the declaration


 
Alx2   (2002-05-23 11:08) [2]

Судя по asm-коду, перед вызовом IntToStr еще инициализироваться должен edx


 
jonik pegas   (2002-05-23 11:16) [3]

>Alx2
Пример кода простой
i:=10;
asm
mov eax,i
call inttostr
end;
Причем портится все именно в inttostr. Есть подозрения что причина в том что inttostr-overload (Int или Int64), а как сказано в help, за который спасибо,, "Int64 do not qualify as register parameters, but all other parameters do". Надо как то обратится именно к Inttostr(integer) или придется копать в направлении FmtStr,а там 3 аргумент const Args: array of const как это в асме выглядит и не представляю


 
Alx2   (2002-05-23 11:22) [4]

А... теперь понятно.
Функция IntToStr возвращает String. Адрес этого стринг (куда ей результат пихать) надо передавать через edx. В противном случае, когда edx неинициализирован, происходит запись куда попало. Отсюда AV


 
Alx2   (2002-05-23 11:25) [5]

Короче говоря, кажется это особенность работы с функциями, возвращающие "сложные" структуры.


 
Alx2   (2002-05-23 11:39) [6]

Вот это работает:
Но надо быть осторожным! Потому-что кое-что нужно сделать дополнительно.

Var S : String;
begin
asm
mov eax, 1234
lea edx, S
call IntToStr
end;
ShowMessage(S); / S = "1234"
end;



 
jonik pegas   (2002-05-23 11:49) [7]

>Alx2
Спасибо
Осторожным буду,пока правда не понял в чем


 
Alx2   (2002-05-23 11:55) [8]

Потерять строчку можешь:) В edx передается что-то типа адреса "перевалочной базы". Так вот, оттуда данные хорошо бы забрать, пока не потерялись. А забрать можно с помощью @LStrAsg


 
PVOzerski   (2002-05-23 11:58) [9]

Кое-что по сабжу - не решение проблемы, но хоть идея, в
каком направлении думать дальше.
IntToStr - в D6 функция перегружаемая. Вот кусочек из Help:

function IntToStr(Value: Integer): string; overload;
function IntToStr(Value: Int64): string; overload;

Так что какой IntToStr вызывается из этого BASM-кода - ???



 
Alx2   (2002-05-23 11:59) [10]

Именно этот:
function IntToStr(Value: Integer): string; overload


 
PVOzerski   (2002-05-23 12:04) [11]

1) Сорри за неграмотность: а как компилятор в ситуации BASM, где нет
контроля типов, определяет, какой IntToStr вызывать?
2) Конструктивное предложение: написать кусок на Паскале,
дизассемблировать и посмотреть, что делает компилятор.


 
Alx2   (2002-05-23 12:09) [12]

Уже посмотрел. сразу call с разными адресами идет (с каким именно - определяется на этапе компиляции), хотя в дебагере всё выглядит как intToStr (и 1-й тип функции, и 2-й).


 
Alx2   (2002-05-23 12:14) [13]

Если пишем в BASM вызов IntToStr, то вызывается функция описанная первой по прядку. И это плохо, так как практически независит от логики программы :( Простая перестановка местами описаний функции приведет к краху.


 
jonik pegas   (2002-05-23 12:23) [14]

Вдогонку темы-такое нехорошее поведения inttostr-передача параметров неявно-это исключение или правило в VCL? WinApi насколько я понимаю себе такого не позволяет


 
PVOzerski   (2002-05-23 12:30) [15]

BTW, во FreePascal перегружаемые функции имеют разные mandled names -
там "вывернуться" всё-таки можно. А в Delphi, я смотрю, проблема. Самое
обидное - wdisasm у меня отказался обрабатывать obj-файл, сделанный D6.


 
Alx2   (2002-05-23 12:31) [16]

Нормальное поведение. В один регистр же не упихнешь весь String (тип функции IntToStr). Вот и появляется неявный параметр. Иначе было бы IntToStr(Value : Integer; Var Result : String);


 
Alx2   (2002-05-23 12:34) [17]

>PVOzerski © (23.05.02 12:30)
Наверняка что-то должно быть...
Хотя - х/з


 
Alx2   (2002-05-23 12:37) [18]

Пытался сделать DLL с подобными функциями - говорит они не могут быть экспортированы.



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

Форум: "Основная";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
8-7127
Phobos
2002-01-11 20:50
2002.06.03
Где можно достать исходники графического редактора?


1-6994
Glonia Zbanov
2002-05-17 11:18
2002.06.03
Как передать String в DLL?


14-7159
mio
2002-04-22 17:02
2002.06.03
Длина шнурков


1-7029
Tahion
2002-05-18 19:14
2002.06.03
CoolBar->ToolBar->ToolButton. Как убрать края ToolButton?


3-6902
Классик
2002-05-11 11:43
2002.06.03
Нужно работать с БД в дос кодировке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский