Ответы пользователя по тегу Assembler
  • Arm ассемблер в ядре Linux?

    apangin
    @apangin
    flag используется как возвращаемое значение (обратите внимание на последнюю строчку).
    В результате, __range_ok вернет 0 тогда и только тогда, когда addr + size <= addr_limit, и при этом не произошло переполнения при сложении.

    Работает это так:
    0. flag = addr_limit (предполагается, что addr_limit != 0);
    1. roksum = addr + size;
    2. если в п.1 не произошло переполнения, то roksum = roksum — addr_limit — 1;
    3. если в после п.2 rok_sum >= 0, то flag = 0
    Ответ написан
    2 комментария
  • Assembler в VS10

    apangin
    @apangin
    Коли это «встроенный ассемблер», процедура должна быть оформлена в соответствии с синтаксисом C.

    int Calculate(int x, int n)
    {
      __asm {
        mov eax, x
        mov ecx, n
        mov ebx, 0
    for:
        push eax
        imul eax, ecx
        imul eax, 2
        add ebx, eax
        pop eax
        loop for
        mov eax, ebx
      }
    }
     
    void main()
    {
      int s = Calculate(2, 2);
      cout << "Result=" << s;
    }
    


    Если же хотите использовать синаксис MASM, нужно код функции выносить в отдельный файл .asm и компилировать с помощью ml.exe.

    Вот тут есть пример для обоих способов.
    Ответ написан
    Комментировать
  • AVR Assembler: разложение числа на цифры

    apangin
    @apangin
    На AVR никогда не программировал, поэтому ограничусь алгоритмом.

    1 способ, короткий.
        while (r16 >= 100) { r17++; r16 -= 100; }
        while (r16 >= 10)  { r18++; r16 -= 10; }
        r19 = r16;
    

    2 способ, быстрый.
        if (r16 >= 200) {
          r17 = 2;
          r16 -= 200;
        } else if (r16 >= 100) {
          r17 = 1;
          r16 -= 100;
        }
        if (r16 >= 50) { r18  = 5; r16 -= 50; }
        if (r16 >= 20) { r18 += 2; r16 -= 20; }
        if (r16 >= 20) { r18 += 2; r16 -= 20; }
        if (r16 >= 10) { r18++;    r16 -= 10; }
        r19 = r16;
    

    3 способ, если чип поддерживает инструкцию MUL.
    Воспользоваться тем, что (N / 10) = Hi(N * 0xCD) >> 3;
    Ответ написан
    Комментировать