Другие языки программирования и технологии

Нужно написать программа на ассемблере для функции СигнумХ . Как правильно это сделать?

функция Сигнум выводит 0 для 0, -1 для отрицательных чисел и 1 для положительных.
В начале программы мы выделяем базу данных для хранения информации, которую мы меняем.
Предполагается: 1. Положить содержимое памяти в регистр. Далее в зависимости от значения регистра вывести определённое значение: 0,1 или -1.
Я лично не могу понять знаки больше и меньше: в программе у меня работает знак "больше или равно", а знак "меньше или равно" переходит по заданному адресу и тормозит программу.
Я понял проблема с отрицательными числами? -1 это 0FFFFFFFFh
Можешь получать ее так:
xor eax, eax
dec eax

Оператор проверки на меньше или равно jle, только, тут целесообразнее юзать jl - меньше

Сначала скажи размер какой числа? Байт, слово, двойное слово?

Там разные диапазоны, у тебя, похоже, проверяет по без знаковому типу. Сложно сказать, не видя код.

Написал код функции с именем check, которая принимает в регистре eax число и в соответствии с этим возвращает в этом же регистре 0 - для 0; -1 - для отрицательных чисел и 1 - для положительных:

check:

test eax, eax
je zero
cmp eax, 0
jl smaller
xor eax, eax
inc eax
retn

zero:
retn
smaller:
xor eax, eax
dec eax
retn

Проверил в отладчике - работает корректно, думаю, дальше разберешься?

P.S. Размер числа 32 бита = 4 байт = сишному типу int
Юрий Чикризов
Юрий Чикризов
1 857
Лучший ответ
Ну. . может предложу не самое изящное решение, но очевидное и легко объяснимое и короче предыдущего ;)

;Вход - число в регистре ax
;Выход - ax = 0, если ax=0; ax=-1, если ax<0, ax=1, если ax>0
signum proc near
test ax, ax ; быстрое сравнение ax с 0
jz @@exit ; если 0 - прыгаем на выход
mov ax, 1 ; иначе ax = 1 (mov не меняет флаги)
jns @@exit ; был ли флаг знака - если нет выходим
neg ax ; иначе ax=-ax (=-1)
@@exit:
retn
signum endp

P.S: Чуть позже подумаю и набросаю наверное поинтереснее.
Вместо mov ax, 1 можно попробовать mov al,1 и cbw (при одинаковом кол-во байт наверное будет быстрее, но сейчас искать таблицу с тактами на каждую команду лень)