Надо ли перейти от асм к с++? - 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; }
Объяснение кода листинга программы
Код написан на ассемблере и выполняет операции сдвига и деления. В коде присутствуют функции, которые выполняют следующие действия:
- __llmul(EAX:ECX;qword second) - выполняет умножение двух чисел.
- __lldiv(EDX:EAX,qword second) - выполняет деление с остатком.
- __lludiv(EDX:EAX,qword second) - выполняет деление без остатка.
- __llmod(EDX:EAX,qword second) - выполняет модульное деление.
- __llumod(EDX:EAX,qword second) - выполняет остаток от деления.
- __llshl(EDX:EAX,CL) - выполняет сдвиг влево на указанное количество бит.
- __llushr(EDX:EAX,CL) - выполняет сдвиг вправо на указанное количество бит. Список переменных и их значений:
- EAX - 0
- ECX - 0
- EDX - 0
- EBX - 0
- ESI - 0
- EDI - 0
- CL - 0 В коде есть несколько комментариев, которые описывают некоторые действия, но они не являются частью списка переменных и их значений.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д