функция Сигнум выводит 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
Можешь получать ее так:
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
Ну. . может предложу не самое изящное решение, но очевидное и легко объяснимое и короче предыдущего ;)
;Вход - число в регистре 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 (при одинаковом кол-во байт наверное будет быстрее, но сейчас искать таблицу с тактами на каждую команду лень)
;Вход - число в регистре 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 (при одинаковом кол-во байт наверное будет быстрее, но сейчас искать таблицу с тактами на каждую команду лень)
Похожие вопросы
- Помогите написать программу на ассемблере, завтра экзамен а я в нём совсем не шарю.
- помогите написать программы в ассемблере
- Нужно составить программу на ассемблере
- срочно помогите написать программу на ассемблере вычисляющую R. R=x2+y2, где x=a+b-c, y=b*c-a. a,b,c вводятся с клавы
- написать программу на ассемблере: найти (в строке) и вывести слово, у которого код первого символа наибольший
- Нужно написать программы в Паскале! Массивы! Срочно! Помогите!
- Помогите написать программу на ассемблере по условию
- Помогите написать программу на Ассемблере
- На чём легче написать программу, на ассемблере лет 40 назад или сейчас на современных языках?
- нужно написать программку на ассемблере, к-рая считает факториал числа n