Войти

Показать полную графическую версию : Нужна помощь с ассемблером


Moustap
18-12-2013, 17:29
Нужно написать на ассемблере i8086 подпрограмму,которая принимает на вход целое число и проверяет,делится ли оно на 16.Если делится,подпрограмма возвращает-1,иначе-0.Подпрограмма должна реализоваться прототипом extern short fun(short val).

Заранее спасибо!)

Efir
18-12-2013, 19:06
число, у которого первая тетрада, тобишь первые 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
число, у которого первая тетрада, тобишь первые 4 бита равны нулю »
Т.е. если число AND 0x0Fh равно нулю - то первые четыре бита числа были равны нулю

Moustap
18-12-2013, 19:38
EFIR,благодарю)

Efir
18-12-2013, 19:41
CyberDaemon, всмысле можно сразу проверить на 4 бита и негородить огород со сдвигом?

Moustap, процедура задачу выполняет, только однозначно не оптимальным способом, но думаю вам сойдет)

Efir
21-12-2013, 15:26
поправил первый код, и вот еще один, куда проще



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




© OSzone.net 2001-2012