Ответы пользователя по тегу Assembler
  • Почему эти строчки записываются в память по-разному?

    @zedxxx
    Потому что в Си, вот эта последовательность "\r" - это управляющая последовательность и в память она записывается как 0xd (один байт). Эту работу выполняет компилятор.

    А в ассемблере как вы строку записали, так она в памяти и лежит, т.е. там символ "\" лежит как 0x5с, и так же лежит рядышком символ "r". Но для HTTP запроса нужен именно перевод строки (последовательность 0xd, 0xa), а не текст "\r".
    Ответ написан
    4 комментария
  • Assembler - Входит ли число в интервал?

    @zedxxx
    В Delphi (для Win32) по умолчанию используется соглашение вызовов register: до 3-х параметров передаётся через регистры EAX, ECX, EDX, результат передаётся через EAX (подробнее, смотри тут: Using Assembler in Delphi).

    Соответственно, получаем вот такой код:
    function IntervalAsm(const AValue, AMin, AMax: Byte): Boolean; register;
    asm
      // Входные параметры уже лежат в регистрах:
      // al = AValue
      // dl = AMin
      // cl = AMax
    
      cmp dl, al     // сравнение с AMin
      ja @@RetFalse  // если al < dl, то выход с False
      cmp cl, al     // сравнение с AMax
      jae @@RetTrue  // если al <= cl, то выход с True
    
    @@RetFalse:
      xor eax, eax   // eax = 0 -> Result = False
      ret
    
    @@RetTrue:
      mov al, 1      // eax = 1 -> Result = True
      ret
    end;

    Если возникают трудности с написанием кода на ассемблере, то лучше всего написать код на Delphi (или даже на самом простом Си), скомпилировать его, а затем декомпилировать и посмотреть, а какой же код генерирует сама Delphi. Для учебных проектов на Delphi прекрасно подойдёт Interactive Delphi Reconstructor (IDR).
    Ответ написан
    Комментировать
  • Как изменить код функции на ассемблере?

    @zedxxx
    В этом случае, переменная value передаётся через стек и её нужно занести в регистры, а shift залетает в регистр eax. Поэтому код будет таким:
    function sar64(value: Int64; shift: LongInt): LongInt;
    asm
      mov ecx, eax
      mov eax, dword ptr [value]
      mov edx, dword ptr [value+4]
      shrd eax, edx, cl
    end;

    А вы ничего не напутали с типом возвращаемого значения? Если входной параметр Int64, то по-моему и на выходе нужно использовать этот же тип.
    Ответ написан