Нужна помощь с ассемблером
Нужно написать на ассемблере i8086 подпрограмму,которая принимает на вход целое число и проверяет,делится ли оно на 16.Если делится,подпрограмма возвращает-1,иначе-0.Подпрограмма должна реализоваться прототипом extern short fun(short val).
Заранее спасибо!)
|
число, у которого первая тетрада, тобишь первые 4 бита, равны нулю, кратно 16. Алгоритм основан на циклической проверке первых 4 бит. Я не программист, посему кто шарит пусть поправляет, если что-то не так.
Код:
fun proc val:WORD ; процедура fun и входящий параметр val размером в слово.
mov ax, val ; пишем входящее число в регистр ax
mov cx, 4 ; в cx пишем кол-во прогонов цикла
mov bx, 1 ; в bx записываем маску с которой будем сравнивать
cxloop:
test ax, bx ; проверяем бит числа на текущее значение маски
jnz false ; если не 0, выходим т.к. число не делится на 16
shl bx, 1 ; если 0, готовим маску для проверки следующего бита, то есть сдвигаем на 1 разряд влево
loop cxloop ; уменьшаем кол-во проходов на один, если CX=0, то выходим, если нет выполняем цикл снова
true:
mov ax, 1
jmp return
false:
mov ax, 0
return:
ret
fun endp
end
|
CyberDaemon |
18-12-2013 19:26 2274521 |
Цитата:
Цитата Efir
число, у которого первая тетрада, тобишь первые 4 бита равны нулю »
|
Т.е. если число AND 0x0Fh равно нулю - то первые четыре бита числа были равны нулю
|
CyberDaemon, всмысле можно сразу проверить на 4 бита и негородить огород со сдвигом?
Moustap, процедура задачу выполняет, только однозначно не оптимальным способом, но думаю вам сойдет)
|
поправил первый код, и вот еще один, куда проще
Код:
fun proc val:WORD ; процедура fun и входящий параметр val размером в слово.
mov ax, val ; пишем входящее число в регистр ax
test al, 00001111B ; любой из младших 4 бит равен единице?
jnz false ; если да, то число не кратно 16, false
true:
mov ax, 1
jmp return
false:
mov ax, 0
return:
ret
fun endp
|
Время: 08:23.
© OSzone.net 2001-