если еще актуально, я немного откомментировал код и написал процедурку duodec (переводит число в 12-рич. сис. и выводит его на экран)вот измененный код (процудуру hex оставил на память 🙂 )код не компилировал и не отлаживал, написал как есть, поэтому может и не работатьtitle a10.exe — from 8 to 12code segmentassume cs:codemain: mov si,8; 8 так как исходная с-ма восьмеричная (потом будем умножать на 😎 again: mov bx,0; здесь будет введенное число после перевода его из ascii в числоmov dl,’?’call d1; выводим вопросmov cx,6next: call kbin; считываем символcmp al,’ ‘; если пробел, то конец вводаje backmov ah,0; дальше переводим ascii символ, в число (например код ‘1’ равен 0x31 )and al, 00001111b; теперь ax = 1 (сначало было например 0x31)mov di, ax; временно запомним mov ax, bx; временно запомним (ax = bx = 0 на первой итерации цикла)mul si; умножим на si (=8) на ax (=0), ax = 0add ax, di; сложим с введенным числом (0 + 1)mov bx, ax; запомним результатloop next; перейдем на считывание следующего символаback: mov dl,’=’; выводим =call d1mov dx,bxcall hexw; переводим двух байтовое число в hex (и выводим в станд.вывод)mov dl,’H’call d1; выводим Hcall crlf; перевод строкиjmp again; все сначала (новое число);———- subroutines ————–d1 proc; пишем в станд. выводmov ah,2int 21hretd1 endpkbin proc near; читаем со станд. вводаmov ah,1int 21hretkbin endphex proc near; переводим один символ (один байт) в 16-чную с-му mov ax,cs; push dsmov ds, ax ; set ds=cspush dxmov bx, offset t1mov al, dlclcshr al,1shr al,1shr al,1shr al,1xlatb ; translatemov dl, alcall d1pop axand al, 00001111bxlatb ; translatemov dl, alcall d1; pop dsrett1 db ‘0123456789ABCDEF’hex endpduodec proc near; переводим один символ (один байт) в 12-чную с-му mov ax,csmov ds, ax; set ds=csmov bx, offset t2; в bx адрес начала буфера; переводим число в ascii (в 12-чной сис-ме и складываем в буфер в обратном порядке)label0:movax, dx; в ax числоcdqidiv 12; делим число на 12 (получаем ah – остаток, al – частное)cmpah, 9; сравним, если число <= 9, то прибавим '0' иначе 'a'jlelabel1addah, 87;число - 10 + 'a' movbyte ptr [bx], ah ; запишем в буферjmplabel2label1:addeax, 48; число + '0'movbyte ptr [bx], ah ; запишем в буферlabel2:addbx, 1; увеличим указатель на буфер на 1mov dx, al; запишем частное от деления cmpdx, 0; проверим на 0 и если не равно, еще один циклjg label0; выводим буфер на печать в обратном порядке (на печать выходит в прямом)label4:subbx, 1; уменьшим указатель на буфер, так сейчас он указывает за последнуюю буквуxor dx, dxmovdl, byte ptr [bx] ; в dl буква по указателюcall d1; выводим букву в станд. вывод (на экран например)mov ax, offset t2cmpax, bx; проверим не дошли ли мы до начала буфераjnelabel4; цикл еще разretbf db ' '; буфер, достаточный для размещения строки результатаduodec endphexw proc near; переводим два символа (dx содежит число)call duodecmov dl,' 'call d1rethexw endpcrlf proc near; перевод строкиmov dl, 10call d1mov dl, 13call d1retcrlf endp
Copyright ©