Надо ли перейти от асм к с++? - Assembler

Узнай цену своей работы

Формулировка задачи:

Я знаю, что начинающие бывают надоеливо смешными с своими наивными вопросами, поэтому ответы пусть пишут только те, кому не хочется блестнуть своей иронией. За дельный совет спасибо! Недавно решил с асм переключиться на с++. Но при процессе обнаружил, что на с++ машина как то теряется, пишешь и уже предчувствуешь, где то что то выкинет и ты не в состоянии все это заранее предотвратить. Я в debug.exe адреса самостоятельно, почти в уме считывал и поэтому все понимал сразу если код получался неверным. А тут хоть компилятор и предлагает какую ошибку надо исправить, все ровно не видно настоящей причины. И еще; сравнивая одинаковые программы на асм и с++, видно, что в текстовом отношении с++ не меньше, а по обему асм и меньше и быстрее. У меня visual studio 2008 и при работе как трактор пихтит. Те кто разбирается в обоих программах пусть скажут, стоит ли тратить время на с++, или лучше по асм- у усовершенствоваться? Всем спасибо!

Решение задачи: «Надо ли перейти от асм к с++?»

textual
Листинг программы
qword stdcall __llmul(EAX:ECX;qword second);
qword stdcall __lldiv(EDX:EAX,qword second);
qword stdcall __lludiv(EDX:EAX,qword second);
qword stdcall __llumod(EDX:EAX,qword second);
qword stdcall __llmod(EDX:EAX,qword second);
 
:qword stdcall __llmul(EAX:ECX,qword second)
{
    $push ECX
    $mul SSDWORD[#second]
    ECX><EAX;
    $mul SSDWORD[#second+4]
    ECX+=EAX;
    $pop EAX
    $mul SSDWORD[#second];
    EDX+=ECX;
}
 
inline CALCDIV()
uses EBP
{
    EBP=ECX;
    ECX=0x40;
    EDI:ESI=0;
    loop(ECX){
        EAX<<=1;
        $rcl edx,1
        $rcl esi,1
        $rcl edi,1
        IF(EDI:ESI<EBP:EBX)CONTINUE;
/*      IF(EDI>=EBP){
            IF(CARRYFLAG||ZEROFLAG){
                IF(ESI<EBX)CONTINUE;
            }*/
            EDI:ESI-=EBP:EBX;
            EAX++;
//      }
    }
}
 
:qword stdcall __lldiv(EDX:EAX,qword second)
uses EBX ESI EDI ECX
{
    EDI=0;
    ECX:EBX=second;
    IF(ECX==0){
        IF(EDX==0)||(EBX==0){
            $div    ebx
            EDX=0;
            RETURN;
        }
    }
    IF(long EDX<0){
        -EDX:EAX;
        EDI|=1;
    }
    IF(long ECX<0){
        -ECX:EBX;
        EDI^=1;
    }
    $push   EDI
    CALCDIV();
    $pop    ebx
    IF($test EBX,1)-EDX:EAX;
}
 
:qword stdcall __lludiv(EDX:EAX,qword second)
uses EBX ESI EDI ECX
{
    ECX:EBX=second;
    IF(ECX==0){
        IF(EDX==0)||(EBX==0){
            $div EBX
            EDX=0;
            RETURN;
        }
    }
    CALCDIV();
}
 
:qword stdcall __llmod(EDX:EAX,qword second)
uses EBX ESI EDI ECX
{
    EDI=0;
    ECX:EBX=second;
    IF(ECX==0){
        IF(EDX==0)||(EBX==0){
            $div EBX
            EAX><EDX;
            EDX=0;
            RETURN;
        }
    }
    IF(long EDX<0){
        -EDX:EAX;
        EDI|=1;
    }
    IF(long ECX<0)-ECX:EBX;
    $push   EDI
    CALCDIV();
    EDX:EAX=EDI:ESI;
    $pop    EBX
    IF($test EBX,1)-EDX:EAX;
}
 
:qword stdcall __llumod(EDX:EAX,qword second)
uses EBX ESI EDI ECX
{
    ECX:EBX=second;
    IF(ECX==0){
        IF(EDX==0)||(EBX==0){
            $div EBX
            EAX><EDX;
            EDX=0;
            RETURN;
        }
    }
    CALCDIV();
    EDX:EAX=EDI:ESI;
}
 
:qword fastcall __llshl(EDX:EAX,CL)
{
    IF(CL<0x20){
        $shld   EDX,EAX,CL
        EAX<<=CL;
        RETURN;
    }
    IF(CL<0x40){
        EDX=EAX;
        EDX<<=CL;
        EAX=0;
        RETURN;
    }
    EDX:EAX=0;
}
 
:qword fastcall __llushr(EDX:EAX,CL)
{
    IF(CL<0x20){
        $shrd   EAX,EDX,cl
        EDX>>=CL;
        RETURN;
    }
    IF(CL<0x40){
        EAX=EDX;
        EDX=0;
        EAX>>=CL;
        RETURN;
    }
    EDX:EAX=0;
}

Объяснение кода листинга программы

Код написан на ассемблере и выполняет операции сдвига и деления. В коде присутствуют функции, которые выполняют следующие действия:

  1. __llmul(EAX:ECX;qword second) - выполняет умножение двух чисел.
  2. __lldiv(EDX:EAX,qword second) - выполняет деление с остатком.
  3. __lludiv(EDX:EAX,qword second) - выполняет деление без остатка.
  4. __llmod(EDX:EAX,qword second) - выполняет модульное деление.
  5. __llumod(EDX:EAX,qword second) - выполняет остаток от деления.
  6. __llshl(EDX:EAX,CL) - выполняет сдвиг влево на указанное количество бит.
  7. __llushr(EDX:EAX,CL) - выполняет сдвиг вправо на указанное количество бит. Список переменных и их значений:
  8. EAX - 0
  9. ECX - 0
  10. EDX - 0
  11. EBX - 0
  12. ESI - 0
  13. EDI - 0
  14. CL - 0 В коде есть несколько комментариев, которые описывают некоторые действия, но они не являются частью списка переменных и их значений.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.357 из 5
Похожие ответы