Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Нужна помощь с ассемблером (http://forum.oszone.net/showthread.php?t=274241)

Moustap 18-12-2013 17:29 2274471

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

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

Efir 18-12-2013 19:06 2274512

число, у которого первая тетрада, тобишь первые 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 равно нулю - то первые четыре бита числа были равны нулю

Moustap 18-12-2013 19:38 2274532

EFIR,благодарю)

Efir 18-12-2013 19:41 2274533

CyberDaemon, всмысле можно сразу проверить на 4 бита и негородить огород со сдвигом?

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

Efir 21-12-2013 15:26 2276183

поправил первый код, и вот еще один, куда проще

Код:


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.

Время: 08:23.
© OSzone.net 2001-