Это - конвертация:
Код | asc2bin proc ;выход: ЕBХ = дв.код push esi ;неявно используемый xor eax,eax xor ebx,ebx lea esi,ascbuf ;указатель на ASCII-число mov ecx,0Ah ;ЕСХ = 10, основание системы счисления cycl: lodsb ;по-байтно из ESI в AL,сама обнуляет счётчик or al,al ;если в AL ничего не попало... jz fin ;...закончили and al,0Fh ;очищаем старшую тетраду <<< ???!!! imul ebx,ecx ;(((0*10)+EAX)*10+EAX)*10+... add ebx,eax ;... cmp ebx,limit ;ebx > 4294967295 ja exit ;переполнение(CF=1 --> "clc" - сбросить флаг) jmp cycl fin: pop esi exit: ret asc2bin endp bin2asc proc pushad ;так - проще mov eax,result ;дв.число-результат lea edi,ascbuf ;правый байт массива "ascbuf"? xor ecx,ecx ;для учёта к-ва символов mov ebx,0Ah ;EBX <-- основание системы счисления conv: xor edx,edx ;убираем предыдущий символ div ebx ;EAX/EBX, EAX=частное, EDX=остаток add dl,30h ;остаток (<10) --> ASCII-символ push edx ;ASCII-символ --> стэк(для разворота) inc ecx ;ЕСХ+1 <-- фиксируем символ, потребуется для "rev" test eax,eax ;если в ЕАХ что-то осталось, то... jnz conv ;...повторяем, если - нет, то... rev: ;...идём дальше pop edx ;извлекаем символ mov [edi],dl ;ASCII-символ --> "ascbuf" inc edi ;смещаемся к месту следующего символа и... loop rev ;...повторяем, пока счётчик (ЕСХ) не обнулится mov byte ptr [edi],0 popad ret bin2asc endp
|
Она - работает, для целых и положительных чисел. Но сам арифмометр - со странностями: к итогу "сложение - вычитание" добавляется "0", а к итогу умножения - "00". Не могу понять - в чём дело. (арифмометр здесь: cupoma58.ru/assembler_04.html,data.html,const.html)
|