Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
qwertyu Гость
|
Добавлено: Пн Сен 27 2004 15:01 Заголовок сообщения: алгоритм декрементирования 16 разрядного значения |
|
|
Процессор обрабатывает 8 битные данные.
Надо написать алгоритм декрементирования 16 разрядного
значения (можешь описывать как угодно, лишь бы понятно было).
Имеем: инкремент регистра, декремент, логические операции -
и/или/исключающее или, проверка нулевого результата, проверка
отдельно взятого бита, переход на заданный адрес (все операции применимы к байту). Чтоб просто было и красиво.
L-младшая часть(8бит), H-старшая часть(8бит)
if L>0 then
dec(L);
else
dec(H); L=255;
end
1. dec - уменьшение на единицу
Фрагмент будет написан на ассемблере, соответственно там нет
штук типа else и тд. Там есть проверка байта на ноль и безусловный переход на метку. если истино. если ложно, то пропуск команды перехода.
Соответственно если в регистре 1 ( в любом) то делается декремент
с проверкой и выполняется действие при истине. А по идее должно
выполнится действие. Если сделать декремент от 0, то в регистр запишется число 225, проверка на ноль даст отрицательный результат. Отдельно проверку на ноль можно сделать с помощью
логических операций и/или/исключающее или - эти операции
изменяют флаг (устанавливают бит в 1 если операция дает нулевой
результат).
помогите пожалуйста написать алгоритм ,а не программу. |
|
Вернуться к началу |
|
|
droopy
Зарегистрирован: 28.07.2004 Сообщения: 168
|
Добавлено: Пн Сен 27 2004 18:41 Заголовок сообщения: |
|
|
Под какую такую архитектуру пишешь? БК 8086 имел 16и разрядную
архитектуру если не ошибаюсь. |
|
Вернуться к началу |
|
|
Go
Зарегистрирован: 27.09.2004 Сообщения: 6 Откуда: Russia
|
Добавлено: Вт Сен 28 2004 01:42 Заголовок сообщения: |
|
|
ето видимо k50xx
Цитата: |
Соответственно если в регистре 1 ( в любом) то делается декремент
с проверкой и выполняется действие при истине.
| - вот етого не очень понял,
пример твоего кода приведи?
и в чем задача - просто в алгоритме ?-
или чтобы код верно работал?
[
repeat
repeat
al<-al-1
until (al=0)
ah <-ah-1
al<-255
until ah=0
]
если я точно помню - я реализовывал все просто -
просто делал декремент младшей части -
если флаг стн-ся нулевым делал прин. декр. старшей
и ее явную проверку на 0
(возможно использовал стек)
- в конце концов можно использовать стек для
сохранения значений регистра (если тебя это беспокоит)
и проверять его явно на 0. _________________ Спокойно! - кричал админ и
думал: идем ко дну... |
|
Вернуться к началу |
|
|
FUKS
Зарегистрирован: 14.04.2002 Сообщения: 148 Откуда: Москва
|
Добавлено: Вт Сен 28 2004 10:54 Заголовок сообщения: Re: алгоритм декрементирования 16 разрядного значения |
|
|
qwertyu писал(а): | Фрагмент будет написан на ассемблере ... помогите пожалуйста написать алгоритм ,а не программу. |
Алгоритм проще расписать в виде программы. Если набор команд позволяет, то можно сделать так: Код: |
xor A,A ; Или mov A,0 (А - регистр) - обнулить A
dec L
adc A,0 ; Поместить в A значение флага переноса (происходит при L=0)
sub H,A ; И вычесть его из H
|
Если команды adc нет, то то же самое с переходом: Код: |
dec L
jnc NC ; Переноса нет
dec H
NC:
|
В общем, надо вычитать из H значение флага переноса (1) после dec L. |
|
Вернуться к началу |
|
|
|