Пишу: Код (Text): org 0800h lxi h,250 mov a,h rar mov h,a mov a,l rar hlt end Получаю A = 125. Пишу: Код (Text): org 0800h lxi h,260 mov a,h rar mov h,a mov a,l rar hlt end Получаю A = -130. Откуда минус?? P.S. ASM-80
Тык в 8 битные больше 255 не влезет же. И это если беззнаковые. Ежели нужно со знаком, то в 8 бит вы только от -127 до 127 запихнете
А что тут объяснять? 8 бит = 2^8 комбинаций = 256 максимальное значение. То есть в восми-битный регистр можно запихнуть числа от 0 до 255, или если со знаком то от -127 до +127. Для больших значений нужно использовать два регистра или оперативную память.
Понял. Тогда собственно как мне 260 разделить на 2? Что бы ответ оказался в регистровой паре HL. В методичке указано: Что я не так делаю?
Задача на самом деле не очень простая. Я уже где-то тут на форуме постил полезную библиотеку для 8080, которая включает в себя и процедуру деления 2-байтных чисел. Ладно, прикреплю еще раз, мне не жалко. UPD: А, стоп. Это для 8080, у которого команды деления вообще нет по моему. А тут я не знаю, я фигово знаю этот ассемблер. Но все равно, может быть будет полезно.
Огромное спасибо за библиотеку, "умножение целых чисел" это моя следующая задача ))) Здесь тоже нету, rar это цикличный сдвиг влево. Вообще я не понял особо как оно делит, добился того что работает и пользуюсь. Есть идеи?
Вообще-то это сдвиг вправо. И не поймёте как оно работает, так как не слушаете то что вам говорят. Курите двоичную систему счисления.
Вправо, да. Ошибся-перепутал с RAL. Вспомнил это, при сдвиге вправо число уменьшается в 2 раза, 1000 (8) > 0100 (4) и т.д..
Нужно сдвинуть h вправо на 1, затем сдвинуть l вправо на 1, но с учетом флага переноса (carry flag). Но для начала в hl нужно положить это число.
AlexSun на x86: для беззнаковых чисел: mov ax, [nubmer] shr ah rcr al для чисел со знаком: mov ax, [nubmer] sar ah rcr al на свой вариант асма сам переводи - я его не помню.