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

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

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

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

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

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

Код, который дает тот же результат на delphi
Код:
Function UpString4ToLongWord(const s:string): LongWord;
var
  i, j:byte;
  c:array [0..3] of char;
Begin
 j:=length(s);
 For i:=0 to 3 do begin
     If i<j then c[i]:=UpCase(s[j-i])
     Else c[i]:=#0;
 end;
 Result:=LongWord(c);
End;
И вот вопрос, что лучше? Потому что анализ cpu выдал меньше ассемблерных строк тут
Но тут куча работы с переменными
Kronos913 вне форума Ответить с цитированием
Старый 09.07.2021, 02:39   #52
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Потому что анализ cpu выдал меньше ассемблерных строк тут
А что тут тогда думать?
Не ну я не возражаю, чтобы вы продолжали изучать ассемблер. Раз уж вы так упорны в этом деле. Глядишь и что-то полезное получится со временем.
northener вне форума Ответить с цитированием
Старый 09.07.2021, 03:01   #53
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Вот с таким вот костылем программа работает
Код:

Function prov(s:string): longword;
var
q:longword;
begin
q:=length(s);
Ну раз уж вы решили писать код на ассемблере, то нафига вам использовать Дельфийскую функцию Length? Вам уже сказали как зайти внутрь функции и посмотреть её ассемблерный код.
northener вне форума Ответить с цитированием
Старый 09.07.2021, 13:20   #54
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ну раз уж вы решили писать код на ассемблере, то нафига вам использовать Дельфийскую функцию Length? Вам уже сказали как зайти внутрь функции и посмотреть её ассемблерный код.
Ну вот в том проблема, что когда я так сделал - программа начала выдавать какой-то бред. И я не пойму, почему...
Kronos913 вне форума Ответить с цитированием
Старый 09.07.2021, 15:06   #55
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
CMP проверяет не только равенства но и неравенства.
Если быть точным CMP взводит флаги а далее выполняем джампы
JE =
JNE <>
JL <
JLE <=
JG >
JGE >=
Правда у меня почему то SUB вместо CMP используется.
А можно ли к одному cmp подсоединить несколько условий ответа?
Ну то есть. Если сравнивать 2 числа, может же быть 3 варианта: <, = и >

И можно ли за один cmp обработать все 3 версии? Или надо сначала проверить один вариант (например <), а потом еще раз сравнивать на предмет = ?
Kronos913 вне форума Ответить с цитированием
Старый 09.07.2021, 15:18   #56
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
А можно ли к одному cmp подсоединить несколько условий ответа?
Можно, именно так и делается.

А вообще открываете https://www.intel.com/content/dam/ww...ual-325383.pdf и смотрите:
jcc - флаги не меняют, а только проверяют -> cmp, jcc, jcc, jcc, ... будет работать.
ForenLi вне форума Ответить с цитированием
Старый 11.07.2021, 01:30   #57
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

Код:
procedure KeyEng2(var c:char);
const
 Ke1= '}F<DULT:PBQRKVYJGHCNEA{WXIO}SM">Zf,dult;pbqrkvyjghcnea[wxio]sm''.z';
asm
  mov eax, c
  cmp eax, 191
    JL @Prov2
  mov ecx, Ke1

  @Prov2:



  @End1:
  mov c, eax
  @Finish:
end;
Выдает ошибку на этой строчке. Почему?
Код:
 mov eax, Ke1

Последний раз редактировалось Kronos913; 11.07.2021 в 01:36.
Kronos913 вне форума Ответить с цитированием
Старый 11.07.2021, 01:31   #58
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

И еще, не хочет передавать чар в один байт регистра. Тоже ошибка есть так:
Код:
mov al, c

Последний раз редактировалось Kronos913; 11.07.2021 в 01:33.
Kronos913 вне форума Ответить с цитированием
Старый 11.07.2021, 02:01   #59
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Выдает ошибку на этой строчке. Почему?
Потому что неверный/невалидный второй операнд для этой инструкции.
Вам дали ссылку на документ с подробным описанием инструкций ассемблера, но вы похоже изучать его не желаете. Вольному-воля. Но с таким подходом я уж точно не доживу до того момента, когда вы хоть как-то освоите ассемблер.
northener вне форума Ответить с цитированием
Старый 11.07.2021, 14:09   #60
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 637
По умолчанию

К сожалению, с английским тяжело...
Я просто не совсем понимаю, почему переменная размером с 1 байт не хочет перемещаться в 1 байт регистра
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