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 сдвигами и сложением.
Другие языки программирования и технологии
Ассемблер сдвиги. Как умножить любое число на 13 с помощью сдвигов в ассемблере
Блин, два "Просветленных", а какие разные ответы! Первый = 100% тупости, а вот второй хотел сказать следующее.. .
Три сдвига влево - получаем исходное х 8. Еще раз исходное на 2 влево - получаем исходное х 4. Складываем первый результат, второй и исходное. Имеем икс* (8 + 4 + 1) = икс * 13.
Три сдвига влево - получаем исходное х 8. Еще раз исходное на 2 влево - получаем исходное х 4. Складываем первый результат, второй и исходное. Имеем икс* (8 + 4 + 1) = икс * 13.
умножение на 10 - сдвиг вправо. Вот про 13 - хз
13 = 8 + 4 +1
Ни о чем не говорит ?)
Ни о чем не говорит ?)
не очень хорошо знаю ассемблер.
только учусь
вообщем что смог то сделал
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
только учусь
вообщем что смог то сделал
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
Похожие вопросы
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- как доказать, что любое число больше 7 является суммой 3 и 5?
- Как перевести из 16-и ричной системы любое число в 2-ую, 8-ую и 10-ую системы счисления?
- С помощью команд fpu вычислить площадь круга, исходя из введѐнного диаметра. Ассемблер...
- Что может ассемблер?
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать
- Ассемблер. Определить наименьшее число из из чисел меньши 2Eh
- Программа, которая находит разность двух чисел (IEEE 754 стандарт double) ассемблер.
- Нужна помощь с ассемблером
- Вопрос по изучению языка Ассемблера под MS DOS. (Нужны советы по программному обеспечению/программированию)