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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2022, 14:09   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Почему деление на 0?

Код:
Function ProbelsInStr(const s:string128; const c:char; const chastota, nachalo:byte):ShortString;
asm
  mov ecx, 0
  mov cl, chastota

  push ebx
  push edi
  push esi

  mov edi, result
  mov esi, s

  mov eax, 0
  mov al, [esi]
  mov edx, 0

  div ecx

  pop esi
  pop edi
  pop ebx
end;
Почему на "div ecx" выдаёт ошибку деления на ноль?
Kronos913 вне форума Ответить с цитированием
Старый 24.08.2022, 14:15   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Почему после такого кода
Код:
  mov ecx, 0
  mov cl, chastota
в cl ноль, а не chastota ?
Kronos913 вне форума Ответить с цитированием
Старый 24.08.2022, 14:24   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Самое забавное, что если использовать регистр ebx - то все ок
Kronos913 вне форума Ответить с цитированием
Старый 24.08.2022, 16:55   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Наверное все дело в типе вызова (register), когда параметры передаются через регистры. Вы попросту стираете передаваемое значение присваивая mov ecx, 0. После этого команда mov cl, castota, которая по факту превращается в mov cl, cl (см. в окне ассемблера, предварительно остановив исполнение программ на этой команде), ничего не заносит в регистр cl.

Чтобы в будущем не натыкаться на эти проблемы, тогда стоит указывать тип вызова не использующий для передачи параметров регистры. Например:
Код:
Function ProbelsInStr(const s:string128; const c:char; const chastota, nachalo:byte):ShortString; stdcall; // передавать параметры через стек

Последний раз редактировалось macomics; 24.08.2022 в 16:58.
macomics вне форума Ответить с цитированием
Старый 24.08.2022, 19:25   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

А вот и объяснение всем загадкам=))

Кстати, ради интереса по crtl+alt+C посмотрел код

Некоторые переменные копируются с регистров, а некоторые с оперативки
Kronos913 вне форума Ответить с цитированием
Старый 24.08.2022, 19:29   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Некоторые отправились в процедуру через регистры, а некоторые через оперативку

Вопрос: можно ли как-то в строке процедуры задать какую переменную как конкретно передавать и какую в какой регистр отправлять?

И можно ли 2 переменных типа байт, или чар через один регистр передать?
Изображения
Тип файла: png изображение_2022-08-24_192753315.png (8.4 Кб, 24 просмотров)
Kronos913 вне форума Ответить с цитированием
Старый 24.08.2022, 19:51   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Только если напишите свой способ вызова через ассемблерную вставку как inline процедуру.
Задавая названия вызовов выбирать можно из стандартных способов: [pascal], cdecl, register, stdcall
[] - тип вызова по умолчанию, задавать это название нет необходимости.

Как правило тип вызова определяет порядок передачи аргументов и буфер для их передачи, а также еще вариант очистки от аргументов.
Например stdcall отличается от cdecl только тем, что в последнем аргументы из стека очищает вызвавшая подпрограмма. А первый тип предполагает, что эту очистку выполнит вызванная процедура.
Но в обоих вызовах аргументы передаются через стек в обратном порядке (сначала последний).

Только обычно хватает перечисленных стандартных типов, а вот возня со своим типом вызова обычно требуется только для совместимости с нестандартными библиотеками (например, cdecl добавлен для программ написанных на C/C++; он так и расшифровывается C declaration). Для всех остальных случаев хватает 4-х перечисленных.

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

То есть, я правильно понял? Эта метка означает, что все переменные будут идти через регистры?
Код:
Function FilterStr255(const StrIn, StrFilter: ShortString):ShortString; register;
Kronos913 вне форума Ответить с цитированием
Старый 24.08.2022, 20:49   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Нет. Только первые 3. Остальные через стек. Но в приведенном примере - все

http://www.delphi-hlp.ru/index.php/w...90b5r997162386
еще safecall - я забыл о нем упомянуть.

Последний раз редактировалось macomics; 24.08.2022 в 20:54.
macomics вне форума Ответить с цитированием
Старый 25.08.2022, 11:31   #10
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Зачем Вы кодите на Delphi, если используете ASM?
FaTaL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
деление на 0 , ОДЗ :( jesterXXX Помощь студентам 7 21.10.2012 23:04
Деление в C++ Юнона Общие вопросы C/C++ 10 29.05.2011 17:53
Деление Nikita++ Помощь студентам 8 19.03.2011 18:56
Деление a mod b Emperous Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.02.2010 21:10