shl ассемблер



Shl в ассемблере

Автор Александр Яковлев задал вопрос в разделе Другие языки и технологии

Ассемблер сдвиги. Как умножить любое число на 13 с помощью сдвигов в ассемблере и получил лучший ответ

Ответ от Миоко Таканава[гуру]
13 = (2 + 1) * 4 + 1 - меньше сдвигов (3 против 5), хотя это актуально только для процессоров, которые не умеют одной командой сдвигать больше чем на один разряд.
.model small
.286
.stack 100h
.data
Prompt db 'Введите число: $'
Result db 13,10,'Результат: $'
.code
N69559244:
mov dx,@data
mov ds,dx
mov ah,9
lea dx,Prompt
int 21h
xor cx,cx
mov bx,cx
Input:
mov ah,8
int 21h
or al,al
jne NotFunc
int 21h
jmp Input
NotFunc:
cmp al,0Dh
je keyEnter
cmp al,'0'
jb Input
cmp al,'9'
ja Input
inc cx
int 29h
sub al,'0'
cbw
xchg bx,ax
mov dx,10
mul dx
add bx,ax
jmp Input
keyEnter:
or cx,cx
jz Input
mov ax,bx
shl ax,1
add ax,bx
shl ax,2
add ax,bx
xor cx,cx
mov si,10
Prepare:
cwd
div si
add dl,'0'
push dx
inc cx
or ax,ax
jnz Prepare
mov ah,9
lea dx,Result
int 21h
Print:
pop ax
int 29h
loop Print
mov ah,8
int 21h
mov ah,4Ch
int 21h
end N69559244
P.S. Программа игнорирует нажатие любых клавиш, кроме цифровых и Enter и не проверяет диапазон вводимых чисел.
Программа корректно работает с числами их диапазона 0 .. 2520.
P.P.S. Жирным шрифтом выделен фрагмент, в котором и производится умножение на 13 сдвигами и сложением.

Ответ от Валерий Аникин[гуру]
умножение на 10 - сдвиг вправо. Вот про 13 - хз

Ответ от Sm[гуру]
13 = 8 + 4 +1
Ни о чем не говорит ?)

Ответ от Полосатый жираф Алик[гуру]
Блин, два "Просветленных", а какие разные ответы! Первый = 100% тупости, а вот второй хотел сказать следующее.. .
Три сдвига влево - получаем исходное х 8. Еще раз исходное на 2 влево - получаем исходное х 4. Складываем первый результат, второй и исходное. Имеем икс* (8 + 4 + 1) = икс * 13.

Ответ от Николай Мурин[гуру]
не очень хорошо знаю ассемблер.
только учусь
вообщем что смог то сделал
org 100h
macro um13 [ n ]
{
mov ax,n
shl ax,3
mov bx,n
shl bx,2
mov cx,n
shl cx,0
add ax,bx
add ax,cx
}
um13 5 ; твое число (числа до 5041)
call print_ax
xor ax,ax
int 16h
print_ax:
pusha
xor cx,cx
mov bx,10
isDiv:
xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz isDiv
isOut:
pop ax
or al,30h
int 29h
loop isOut
popa
ret

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Ассемблер сдвиги. Как умножить любое число на 13 с помощью сдвигов в ассемблере
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*