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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2021, 21:37   #41
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

30 минут ищу, никак не найду
То что cmp, eax, ecx проверка на равенство - это нашел

А как проверить на то что одно значение > другого, или < другого?

Cобственно, надо соорудить на ассемблере аналог такой delphi-конструкции:
If (aex>=97) and (aex<=122) then aex:=aex-32;
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 21:45   #42
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
То есть, call StrLen всегда будет давать результат в eax, а в качестве строки использовать последний задействованный регистр?
Или это может еще зависеть от процессора, операционки, и т.д. ?
Пока вам рано задавать этот вопрос. Если я отвечу вы только запутаетесь. Учите соглашения о вызовах которые разработали в Борланде и преведено в справке вашего компилятора D7.
Вам только они понадобятся.

Когда будете вызывать WinAPI из ассемблера вам потребуется выучить cdcal и stdcall.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 08.07.2021, 21:58   #43
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Код:
 mov edx, s
 call StrLen

 mov ecx, edx
 add ecx, eax

 sub ecx, 1

 mov eax, 0
 mov al, [ecx]

 mov result, eax
Попытался сделать код, который вернет последний символ строки. А получился какой-то генератор случайных чисел...
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 21:58   #44
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
То что cmp, eax, ecx проверка на равенство - это нашел

А как проверить на то что одно значение > другого, или < другого?

Cобственно, надо соорудить на ассемблере аналог такой delphi-конструкции:
If (aex>=97) and (aex<=122) then aex:=aex-32;
CMP проверяет не только равенства но и неравенства.
Если быть точным CMP взводит флаги а далее выполняем джампы
JE =
JNE <>
JL <
JLE <=
JG >
JGE >=
Правда у меня почему то SUB вместо CMP используется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 08.07.2021, 22:13   #45
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Код:
 mov edx, s
 call StrLen

 mov ecx, 0

 mov cl, [edx]

 mov result, ecx
Пусть и одинаковый каждый раз результат, но не соответствует коду ни первого ни второго элемента строки
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 22:31   #46
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Код:
 mov edx, s

 mov ecx, 0

 mov cl, [edx]

 mov result, ecx
Нормально работает, показывает первый символ

Но вот теперь, как найти последний символ?
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 23:02   #47
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Что не делаю, не пойму, как в одни регистр положить адрес строки, а в другой - ее длину...
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 23:35   #48
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Вот с таким вот костылем программа работает
Код:
Function prov(s:string): longword;
 var
  q:longword;
begin
 q:=length(s);
 asm
   mov edx, s
   mov ecx, q
   add ecx, edx
   sub ecx, 1

   mov eax, 0
   mov al, [ecx]

   mov result, eax
 end;
end;
При отладке показывает код.

Теперь пробую убрать костыль
Код:
   mov eax, s
   call LStrLen
   mov ecx, eax

   mov edx, s

   add ecx, edx
   sub ecx, 1

   mov eax, 0
   mov al, [ecx]

   mov result, eax
И в процессе выполнения появляется ошибка!

В чем проблема? Из-за чего ошибка? Из eax можно только в переменную в оперативке выгрузить результат функции, чтобы все работало?
Изображения
Тип файла: png изображение_2021-07-08_233133.png (24.8 Кб, 26 просмотров)
Kronos913 вне форума Ответить с цитированием
Старый 08.07.2021, 23:57   #49
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Я вот реально не понимаю... Смотрю в рабочий код компилятора. От моего отличается только тем, что пытаюсь напрямую из eax передать в ecx
Kronos913 вне форума Ответить с цитированием
Старый 09.07.2021, 01:07   #50
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Итак. Вот получилась рабочая функция:
Код:
Function prov(s:string): longword;
 var
  q:longword;
begin
 q:=length(s);
 asm
   mov ecx, q
   mov eax, 0
   cmp ecx, 0
     je @Finish
   mov edx, s
   cmp ecx, 4
       jle @i_1_2
     add ecx, edx
     jmp @Start_c
   @i_1_2:
     add ecx, edx
     mov edx, ecx
     sub edx, 4
   @Start_c:
     mov al, [edx]
     cmp al, 97
       jl @F2
     cmp al, 122
       jg @F2
     sub al, 32
     @F2:
     inc edx
     cmp ecx, edx
       je @Finish
     shl eax, 8
     jmp @Start_c
   @Finish:
   mov result, eax
 end;
end;
И теперь вопрос в том, как убрать этот костыль с лишней переменной и заставить длину строки сохраниться напрямую в регистр ?

Последний раз редактировалось Kronos913; 09.07.2021 в 01:16.
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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