Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2021, 20:12   #31
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Вопрос: а куда записалось значение функции? Как мне переместить его в eax?
В соответствии с соглашением о вызове результат функции кладется в eax, самой функцией.

Со строками нужно вам найти методичку по BASM Delphi

Но в целом у вас ошибки. В первом вы вызываете не правильно.

Код:
mov eax,s
call StrLen
2)
Код:
mov eax,s
mov al,[eax+1]
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 08.07.2021 в 20:20.
Pavia вне форума Ответить с цитированием
Старый 08.07.2021, 20:19   #32
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

К слову говоря, любое обращение к локальным переменным функции выдает ошибку исполнения
Почему?

Код:
Function prov(s:string): longword;
asm
 mov eax, 0
 mov al, byte(s[1])
 mov result, eax {}
end;

Последний раз редактировалось Kronos913; 08.07.2021 в 20:22.
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 20:32   #33
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
К слову говоря, любое обращение к переменным функции выдает ошибку исполнения
Почему?
В BASM нельзя писать s[1] он неправильно это компилирует.
Строки это указатели. Поэтому надо в 2 действия. С начало разыменовывать его, а после прибавить позицию.

Для строк mov eax,s компилятор преобразует либо в mov либо в lea в зависимости от того где лежит переменная в параметрах в регистрах или на стеки. - это компилер меджик BASM'а.

Что касается строки
mov al, byte(s[1])
То тут баг компилятора вместо того чтобы выдать ошибку компиляции запихивает в одну ассемблерную команду две. А так как это не воможно он просто выкидывает первую команду и у вашего компилятора вместо
mov eax, [eax]
mov al, [eax+000001]
на выходе получается
mov al, [000001]
Что неправильно.

Первые 4 кб в программе с нулевыми адресами как раз и служат для отлова ошибок работы с указателями.Операционная система ругается что вы к нулевому(nil) указателю прибавили +1 и пробуете прочитать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 08.07.2021 в 20:39.
Pavia вне форума Ответить с цитированием
Старый 08.07.2021, 20:48   #34
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Код:
 mov ecx, s
 mov bl, [ecx+1]
 mov result, ebx
Все равно выдает ошибку
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 20:52   #35
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Код:
 mov ecx, s
 add ecx, 1
 mov bl, [ecx]
 mov result, ebx
Даже так попробовал, все равно ошибка
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 21:05   #36
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Я вот не пойму...
Код:
 mov eax, s
 mov eax, [eax+1]
 mov result, eax
Работает

Код:
 mov ebx, s
 mov ebx, [ebx+1]
 mov result, ebx
Выдает ошибку

Вопрос: почему? Те же ж самые действия, только регистр другой
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 21:11   #37
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Проверил интереса ради
ecx и edx работают норм. Только ebx вызывает ошибки
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 21:18   #38
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Снова три эксперимента

Код:
 mov eax, s
 call StrLen
 mov result, eax
Работает нормально

Код:
 mov esi, s
 call StrLen
 mov result, esi
Выдает какой-то бред

Код:
 mov esi, s
 call StrLen
 mov result, eax
Работает нормально

То есть, call StrLen всегда будет давать результат в eax, а в качестве строки использовать последний задействованный регистр?
Или это может еще зависеть от процессора, операционки, и т.д. ?
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 21:32   #39
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
ecx и edx работают норм. Только ebx вызывает ошибки
Согласно соглашению о вызове Вы обязаны сохранить, а потом восстановить регистры EBX, ESI, EDI, и EBP

EBX используется как указатель self на объект. EBP как указатель стека на локальные переменные.

Цитата:
Register saving conventions

Procedures and functions must preserve the EBX, ESI, EDI, and EBP registers, but can modify the EAX, EDX, and ECX registers. When implementing a constructor or destructor in assembler, be sure to preserve the DL register. Procedures and functions are invoked with the assumption that the CPU's direction flag is cleared (corresponding to a CLD instruction) and must return with the direction flag cleared.

Note: Delphi language procedures and functions are generally invoked with the assumption that the FPU stack is empty: The compiler tries to use all eight FPU stack entries when it generates code.
http://docwiki.embarcadero.com/RADSt...ter_Convention

EDX нужно будет еще и обнулять перед деление и умножением.

Примечание
Если входные параметры описаны как const или без-var они используется как входной параметры EDX, ECX. Что тоже требует их сохранения.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 08.07.2021, 21:34   #40
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
mov result, eax
Эта строчка лишняя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько вопросов Rost93 PHP 18 19.09.2012 19:38
Несколько вопросов shrek1993 Visual C++ 3 05.08.2012 18:53
несколько вопросов по C Horus92 Общие вопросы C/C++ 2 15.11.2009 16:08
несколько вопросов fitc Общие вопросы Delphi 28 14.07.2009 21:20
Несколько Вопросов Дорст Общие вопросы Delphi 3 12.11.2007 09:18