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

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

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

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

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

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

Еще один вопрос касательно использования asm в delphi

Можно ли загрузить адрес метки в регистр? И потом делать переход по этому адресу из регистра

По аналогии с тем, как можно делать действие с ячейкой памяти, которая имеет адрес сохраненный в регистр - точно так же делать переход на метку
Kronos913 вне форума Ответить с цитированием
Старый 29.08.2022, 14:27   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
lea eax, [metka]
или
Код:
call metka
metka: pop eax
переход
Код:
jmp eax
macomics вне форума Ответить с цитированием
Старый 29.08.2022, 15:19   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Код:
{Вспомогательная процедура}
Procedure WordToStrPerevorot;
asm
  inc esi

  @BeginN:
    cmp esi, edi
      ja @EndD

    mov dl, [edi]
    mov dh, [esi]
    mov [edi], dh
    mov [esi], dl

    inc esi
    dec edi
    jmp @BeginN
  @EndD:
end;

{Основная процедура}
Function WordToStr(const w:longWord; const systema: byte): shortString; register;
asm
  push ebx
  push esi

  {mov eax, w}   {ecx и есть w, по идее}
  {mov ecx, esi} {ecx и есть result, по идее}

  mov esi, result
  mov ebx, 0
  mov bl, systema

  push edi
  lea edi, @Begin1

  cmp bl, 1
    ja @Begin1

  mov bl, 2

  @Begin1:
    cmp eax, ebx
      jb @End1

    mov edx, 0
    div ebx

    @Perevod1:
    cmp dl, 10
      jb @Do10

    cmp dl, 36
      jb @Do36

    cmp dl, 62
      jb @Do62

    mov dl, 35
    jmp @Exit1

    @Do10:
    add dl, 48
    jmp @Exit1

    @Do36:
    add dl, 55
    jmp @Exit1

    @Do62:
    add dl, 61

    @Exit1:
    inc ecx
    mov [ecx], dl

    jmp edi

  @End1:
  mov dl, al

  lea edi, @Last1
  jmp @Perevod1

  @Last1:
  mov edi, ecx

  sub ecx, esi
  mov [esi], cl

  call WordToStrPerevorot

  pop edi
  pop esi
  pop ebx
end;
Kronos913 вне форума Ответить с цитированием
Старый 29.08.2022, 15:32   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Кстати, мне вот интересно, процедура IntTroStr работает по аналогичному принципу? Превращает двоичное число в десятичное по методу остатка от деления?
Kronos913 вне форума Ответить с цитированием
Старый 29.08.2022, 16:06   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

В попытке уменьшить количество делений вы сделали несколько прыжков, некоторые из которых создадут задержку большую чем операция деления

Например вот тут
Код:
    cmp dl, 10
      jb @Do10 {промах}

    cmp dl, 36
      jb @Do36  {промах}

    cmp dl, 62
      jb @Do62  {промах}
Код:
   forward jumps           backward jumps
fasm -d TEST=uselss_cmp_chain test.asm && time ./test
2 passes, 1139 bytes.   2 passes, 1141 bytes.
  18.89 user              32.81 user
   0.57 system             0.01 system
0:19.48 elapsed         0:32.85 elapsed

fasm -d TEST=objectively_better_binary test.asm && time ./test
2 passes, 1137 bytes.   2 passes, 1139 bytes.
  18.72 user              19.26 user
   0.75 system             0.00 system
0:19.50 elapsed         0:19.28 elapsed

fasm -d TEST=four_way_junction test.asm && time ./test
2 passes, 1133 bytes.   2 passes, 1135 bytes.
  27.99 user              28.17 user
   0.00 system             0.55 system
0:28.02 elapsed         0:28.75 elapsed

fasm -d TEST=hack_1234_chain_1 test.asm && time ./test
2 passes, 1133 bytes.   2 passes, 1135 bytes.
  23.61 user              23.52 user
   0.78 system             0.47 system
0:24.41 elapsed         0:24.02 elapsed

fasm -d TEST=hack_1234_chain_2 test.asm && time ./test
2 passes, 1133 bytes.   2 passes, 1135 bytes.
  23.45 user              23.61 user
   0.48 system             0.45 system
0:23.96 elapsed         0:24.07 elapsed

fasm -d TEST=hack_1234_chain_3 test.asm && time ./test
2 passes, 1133 bytes.   2 passes, 1135 bytes.
  23.46 user              23.64 user
   0.36 system             0.32 system
0:23.84 elapsed         0:23.98 elapsed

fasm -d TEST=cmov_for_the_win test.asm && time ./test
2 passes, 1165 bytes.   2 passes, 1167 bytes.
  32.76 user              32.65 user
   0.58 system             0.48 system
0:33.37 elapsed         0:33.16 elapsed

fasm -d TEST=LUTs_are_awesome test.asm && time ./test
2 passes, 1151 bytes.   2 passes, 1151 bytes.
  18.86 user              18.80 user
   0.00 system             0.34 system
0:18.88 elapsed         0:19.16 elapsed

fasm -d TEST=computed_goto test.asm && time ./test
3 passes, 1135 bytes.   2 passes, 1137 bytes.
  18.75 user              18.77 user
   0.00 system             0.28 system
0:18.77 elapsed         0:19.07 elapsed

fasm -d TEST=uber_no_need_to_test_code_from_Furs test.asm && time ./test
2 passes, 1137 bytes.   2 passes, 1139 bytes.
  23.11 user              37.48 user
   0.00 system             0.56 system
0:23.13 elapsed         0:38.07 elapsed
Это результаты тестирования некоторых ассемблерных макросов создающих ветвления. В правом столбце в 3/4 итерациях создавался промах системы предсказания переходов. Тестирование происходило 10`000`000 раз на последовательностях в 1000 элементов (итого 10`000`000`000 ветвлений).

Куда эффективнее будет работать такой код (по принципу LUT)
Код:
const convert: PChar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
//...
    mov edi, result
    lea ebx, convert
    movzx ecx, system
    lea esi, [edi + 32]
    cmp cl, 62 {проверка на выход за границы PChar}
    jae @CvrtError
    xor edx, edx
    cmp cl, 2
    jae @Begin1
    mov cl, 2
@Begin1:
    dec esi
    div ecx
    mov dl, [ebx + edx]
    mov [esi], dl
    cdq
    test eax, eax
    jne @Begin1
    lea ecx, [edi + 32]
    sub ecx, esi
    mov [edi], cl
    cmp cl, 32
    jz @Skip1
    scasb
    rep movsb
@Skip1:
...

@CvrtError:
...

Последний раз редактировалось macomics; 29.08.2022 в 16:29.
macomics вне форума Ответить с цитированием
Старый 29.08.2022, 16:17   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Превращает двоичное число в десятичное по методу остатка от деления?
Пока еще не придумали другого способа получение коэффициентов в полиноме
An*s^n + An-1*s^(n-1) + ... + A2*s^2 + A1*s^1 + A0*s^0 + A-1/s^(1) + A-2/s^2 + ... Am-1/s^(m-1) + Am/s^m
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему адрес метки, на которую ссылаемся при выполнении команды JBC RI, M2, может не совпадать с ожидаемым в программе MCU 8051 IDE? Даниил Крещетов Помощь студентам 4 23.12.2020 14:27
Изменить МАС адрес компьютера и опредилить прошлый МАС адрес компьютера Эвелинка Помощь студентам 11 12.05.2015 15:58
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
Обьявление метки ramzes777 Общие вопросы Delphi 11 01.10.2011 17:28
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39