Сложение чисел

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

Помогите написать программк сложения 2 4-байтных чисел в бсд формате
На микропроцессоре контролере MicroIDE
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

А где ж по нему доки-то нарыть, есть только один дохлый ftp. Будут доки, будет прога
It's a long way to the top if you wanna rock'n'roll
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

М68НС11 напомнил мне старый добрый Z80, только урезаный ;-)
Мнемоники команд примерно те же, только регистров маловато. На Z80 писал только в машинном коде, потому всякие директивы ассемблера вроде ORG, DB и т.п. писать не стал, только код. Отталкивался от инструкции DAA, которая выполняет десятичную коррекцию результата сложения двух BCD чисел, работает по следующему алгоритму:

Код: Выделить всё

IF ((AL AND 0FH) > 9) OR (AF = 1)
THEN
  AL <─ AL + 6;
  AF <─ 1;
ELSE
  AF <─ 0;
FI;
IF (AL > 9FH) OR (CF = 1)
THEN
  AL <─ AL + 60H;
  CF <─ 1;
ELSE CF <─ 0;
алгоритм этот для IA-32, в М68НС11 также есть и аккумулятор, и аналоги флагов CF и AF.
Посему, на IA-32, на привычных инструкциях код будет такой:

Код: Выделить всё

      mov al, byte ptr a
      add al, byte ptr b
      daa
      mov byte ptr c, al
      mov al, byte ptr a + 1
      adc al, byte ptr b + 1
      daa
      mov byte ptr c + 1, al
      mov al, byte ptr a + 2
      adc al, byte ptr b + 2
      daa
      mov byte ptr c + 2, al
      mov al, byte ptr a + 3
      adc al, byte ptr b + 3
      daa
      mov byte ptr c + 3, al
Теперь попробуем этот код перевести на М68НС11.
Насколько я понял, в представлении чисел в памяти М68НС11 идет сначала старший байт, потом младший. Т.е. перевернутое представление.
будем считать, что переменная A находится по адресу $9000, переменная B - $9004 и C - $9008

Код: Выделить всё

ldx #$9000   ; типа в X сейчас адрес переменной A.
ldaa 3, X      ; младший байт первого операнда в регистр A
ldab 7, X      ; младший байт второго в B
aba              ;  A = A + B
daa              ;  десятичная коррекция A, если был перенос, флаг С = 1, теперь надо его не потерять
staa 11, x     ; запись младшего байта результата, теперь повторяем для следующих байт по старшинству, но учитывая переносы
ldaa 2, X
ldab 6, X
adca #0
aba
daa
staa 10, X
ldaa 1, X
ldab 5, X
adca #0
aba
daa
staa 9, X
ldaa 0, X
ldab 4, X
adca #0
aba
daa
staa 8, X
Могу ошибаться, но примерно так
It's a long way to the top if you wanna rock'n'roll
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

Угу спасибо вечером посмотрю
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

А ты ее проверял?

Вот изменил под IDE

org $8000
ldx #$9000 ; типа в X сейчас адрес переменной A.
ldaa 3,X ; младший байт первого операнда в регистр A
ldab 7,X ; младший байт второго в B
aba ; A = A + B
daa ; десятичная коррекция A, если был перенос, флаг С = 1, теперь надо его не потерять
staa 11,x ; запись младшего байта результата, теперь повторяем для следующих байт по старшинству, но учитывая переносы
ldaa 2,X
ldab 6,X
adca #0
aba
daa
staa 10,X
ldaa 1,X
ldab 5,X
adca #0
aba
daa
staa 9,X
ldaa 0,X
ldab 4,X
adca #0
aba
daa
staa 8,X
loop:
bra loop

Но не работает :(
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Я не проверял, ассемблера такого нет. Не работает - понятие растяжимое, что именно - надо выяснить. Попробуй пошагово "потрэйсить" и узнать в какой регистр что попадает. А то вот я думаю, может ldx #$9000 загружает в Х не константу 9000h, а значение из адреса 9000h. Лично я различий между загрузкой констант в регистры непосредственно и зарузкой из памяти прямой адрессацией в синтаксисе так и не уловил. К сожалению там об этом ничего не сказано.

Вот еще небольшая оптимизация:

Код: Выделить всё

ldx #$9000   ; типа в X сейчас адрес переменной A.
ldaa 3, X      ; младший байт первого операнда в регистр A
adda 7, X     ; A = A + младший байт второго
daa              ;  десятичная коррекция A, если был перенос, флаг С = 1
staa 11, x     ; запись младшего байта результата, теперь повторяем для следующих байт по старшинству, но учитывая переносы
ldaa 2, X
adca 6, Х
daa
staa 10, X
ldaa 1, X
adca 5, X
daa
staa 9, X
ldaa 0, X
adca 4, X
daa
staa 8, X
и еще вопрос - что на входе и на выходе получаеться?
It's a long way to the top if you wanna rock'n'roll
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

ldx #$9000
Здесь загружает в в регистр х
И все больше никуда ни в какие регистры ничего не грузятся
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

В х грузится 9000
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Ну это правильно, Х - это адрес переменной А, Х+4 - пер. В и т.д. Если предварительно в этот адрес записать BCD число (в пер. А и В) тогда в С по адресу Х+8 будет их сумма. Проверь по дебаггеру - меняеться ли значения в диапазоне 9000h - 900Bh. На IA-32 такой код работает 100% - если DAA в MicroIDE работает так же как и в Intel (а это, я думаю, бесспорно), то и этот код тоже рабочий. Если есть компилер+дебагер (эмулятор для PC) и весит немного, кидай, посмотрю
It's a long way to the top if you wanna rock'n'roll
Ответить