Консультация № 136959
15.05.2008, 16:05
0.00 руб.
0 1 1
Ув. эксперты, напишите, пожалуйста, программу, которая умножает "word" на "byte" с помощью операторов сдвига. Для вывода нужно использовать умножение 65535 на 255 в шестнадцатеричной и десятичной системе. Программа должна рассматривать числа как беззнаковые. Вывод должен выглядить так:

FFFF * FF =
65535 * 255 =

Обсуждение

давно
Посетитель
7438
7205
16.05.2008, 18:08
общий
это ответ
Здравствуйте, Sbuber!
Программа в приложении.



Приложение:
.model tiny,C .dataw dw 0ffffhb db 0ffhr db 3 dup (0) ;т.к.умножаем слово на байт, то для ответа достаточно 2+1=3 байта .code .386 .startup mov al,b ;чтобы в стек отправить 2 байта call MulWordByte,w,ax,offset r ;умножим, в r будет ответ ;выводит результат mov ax,w ;слово w в hex call PrintWordHex mov ah,2 mov dl,‘ ‘ int 21h mov dl,‘*‘ ;разделители int 21h mov dl,‘ ‘ int 21h mov al,b ;байт в hex call PrintByteHex mov ah,2 mov dl,‘ ‘ int 21h mov dl,‘=‘ ;разделители int 21h mov dl,‘ ‘ int 21h mov al,r+2 ;сначала выведем старший байт результата call PrintByteHex mov ax,word ptr r ;затем два младших как слово call PrintWordHex mov ah,2 mov dl,0dh ;на новую строку int 21h mov dl,0ah int 21h call PrintWord, offset w ;выведем слово в десятичном виде mov ah,2 mov dl,‘ ‘ int 21h mov dl,‘*‘ int 21h mov dl,‘ ‘ int 21h call PrintByte, offset b ;выведем бай в десятичном виде mov ah,2 mov dl,‘ ‘ int 21h mov dl,‘=‘ int 21h mov dl,‘ ‘ int 21h call Print3Bytes,offset r ;выведем результат в десятичном виде mov ax,4c00h ;выход int 21hPrintWordHex proc ;слово в hex push ax ;сохраним al в стеке mov al,ah ;выведем старший байт call PrintByteHex pop ax ;восстановим младшийPrintByteHex proc ;выводим байт в hex push ax ;сохраним младшую тетраду shr al,4 ;старшая тетрада 00-0f call PrintHexDigit ;выводим hex цифру pop ax ;восстановим младшую тетраду and al,0fh ;выделимPrintHexDigit proc ;выводим hex цифру add al,90h ;последующие 4 команды преобразовывают daa ;число 00-0f в символы ‘0‘-‘9‘,‘A‘-‘F‘ adc al,040h daa mov dl,al ;выводим mov ah,2 int 21h retPrintHexDigit endpPrintByteHex endpPrintWordHex endp;Для преобразования использую 32-битные регистры, так проще...;Если нужны обязательно только 16-битные - придется переделать...PrintByte proc, pData:WORD ;выводим десятичное число - байт mov bx,pData ;bx - адрес байта movzx eax,byte ptr[bx] ;eax - число jmp PW_number ;на выводPrintWord proc, pData:WORD ;выводим десятичное число - слово mov bx,pData ;bx - адрес слова movzx eax,word ptr[bx] ;eax - число jmp PW_number ;на выводPrint3Bytes proc, pData:WORD ;выводим десятичное число - 3 байта mov bx,pData ;bx - адрес 3 байт mov eax,dword ptr[bx] and eax,0ffffffh ;eax - числоPW_number: ;конвертация число из eax в числовую последовательность mov ebx,10 ;будем делить на 10 xor cx,cx ;счетчик цифрPW_loop: ;цикл нахождения очередной цифры xor edx,edx ;подготавливаемся к делению div ebx ;в EDX остаток - очередная цифра (от младшего разряда к старшему) push dx ;сохраним в стеке! inc cx ;и посчитаем test eax,eax ;дошли до конца? jnz PW_loop ;еще есть...PW_print: ;выводим полученные цифры pop dx ;извлекаем из стека очередную цифру (от старшего разряда к младшему) or dl,‘0‘ ;делаем из числа символ mov ah,2 ;выводим int 21h loop PW_print ;повторяем retPrint3Bytes endpPrintWord endpPrintByte endpMulWordByte proc, ww:word,bb:byte,p3bytes:word ;умножение сдвигами mov bx,p3bytes ;адрес, куда писать результат mov word ptr [bx],0 ;обнулим mov byte ptr [bx+2],0 mov ax,ww ;очередное слагаемое будет в регистрах dh:ax mov dl,bb ;биты dl будут нам указывать, складывать очередное слагаемое или нет mov dh,0 mov cx,8 ;анализируем 8 бит dlshift_loop: shr dl,1 ;сдвигаем очередной бит в C jnc shift_next ;если ноль, то не прибавляем add [bx],ax ;добавляем adc [bx+2],dhshift_next: ;формируем очередное слагаемое rcl ax,1 ;сдвигом на 1 бит rcl dh,1 ;всех 3 байтов! loop shift_loop ;циклим по битам dl retMulWordByte endp end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа