Сложение чисел
Модератор: Andy
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Помогите написать программк сложения 2 4-байтных чисел в бсд формате
На микропроцессоре контролере MicroIDE
На микропроцессоре контролере MicroIDE
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
А где ж по нему доки-то нарыть, есть только один дохлый ftp. Будут доки, будет прога
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Сама программа
http://www.bipom.com/microide.shtm
Доки
http://slil.ru/23677786
http://slil.ru/23677842
http://www.bipom.com/microide.shtm
Доки
http://slil.ru/23677786
http://slil.ru/23677842
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
М68НС11 напомнил мне старый добрый Z80, только урезаный ;-)
Мнемоники команд примерно те же, только регистров маловато. На Z80 писал только в машинном коде, потому всякие директивы ассемблера вроде ORG, DB и т.п. писать не стал, только код. Отталкивался от инструкции DAA, которая выполняет десятичную коррекцию результата сложения двух BCD чисел, работает по следующему алгоритму:
алгоритм этот для IA-32, в М68НС11 также есть и аккумулятор, и аналоги флагов CF и AF.
Посему, на IA-32, на привычных инструкциях код будет такой:
Теперь попробуем этот код перевести на М68НС11.
Насколько я понял, в представлении чисел в памяти М68НС11 идет сначала старший байт, потом младший. Т.е. перевернутое представление.
будем считать, что переменная A находится по адресу $9000, переменная B - $9004 и C - $9008
Могу ошибаться, но примерно так
Мнемоники команд примерно те же, только регистров маловато. На 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, на привычных инструкциях код будет такой:
Код: Выделить всё
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 идет сначала старший байт, потом младший. Т.е. перевернутое представление.
будем считать, что переменная 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
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
Угу спасибо вечером посмотрю
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
-
- Сообщения: 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
Но не работает
Вот изменил под 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
Но не работает

Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Я не проверял, ассемблера такого нет. Не работает - понятие растяжимое, что именно - надо выяснить. Попробуй пошагово "потрэйсить" и узнать в какой регистр что попадает. А то вот я думаю, может 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
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
ldx #$9000
Здесь загружает в в регистр х
И все больше никуда ни в какие регистры ничего не грузятся
Здесь загружает в в регистр х
И все больше никуда ни в какие регистры ничего не грузятся
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
-
- Сообщения: 340
- Зарегистрирован: 22 ноя 2004, 19:15
- Откуда: Минск
- Контактная информация:
В х грузится 9000
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Ну это правильно, Х - это адрес переменной А, Х+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