вопрос по прогремме на ассемблере для mcs51

Oct 19, 2003 3 Replies

сложение двух двухбайтных чисел 2341 +2341 ,мне надо их расположить во внутренней или внешней памяти начиная с определенного адреса.Как это сделать? name test cseg at 0000h org 0000h mov dptr,#2341 mov r2,dph mov r3,dpl mov dptr,#2341 mov r4,dph mov r5,dpl mov a,r2 add a,r4 mov r6,a mov a,#0 mov a,r3 add a,r5 mov r7,a end


Привет Samodelkin!

19 Oct 03 14:52, Samodelkin писал All:

S> сложение двух двухбайтных чисел 2341 +2341 ,мне надо их расположить во S> внутренней или внешней памяти начиная с определенного адреса.Как это S> сделать?

Во внутреннюю память данные помещают с помощью mov, во внешнюю - с помощью movx.

S> mov dptr,#2341 S> mov r2,dph S> mov r3,dpl S> mov dptr,#2341 S> mov r4,dph S> mov r5,dpl S> mov a,r2 S> add a,r4 S> mov r6,a S> mov a,#0 S> mov a,r3 S> add a,r5 S> mov r7,a

Ты бы это, систему команд получше изучил, да книжки какие-нибудь по программированию с примерами почитал, для mcs51 их много разных. Сложение ты написал вдвое длиннее чем можно было бы, да еще и выдает оно неправильный результат. Типичное сложение обычно выглядит так:

mov a, arg1 add a, arg2 mov res, a mov a, arg1 + 1 adc a, arg2 + 1 mov res + 1, a

А еще было бы неплохо задавать вопросы более понятно. Может быть для "расположения чисел в памяти" тебе нужны вовсе не команды процессора, а хороший линкер. Кстати, рекомендую ассемблер с линкером из комплекта SDCC (sdcc.sourceforge.net кажется), заодно там и неплохой компилятор С...

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Смотрю куда глаза глядят...

Hello Samodelkin.

Воскресенье, Октябрь, 19, 2003 14:52:18, Samodelkin wrote to All:

S> сложение двух двухбайтных чисел 2341 +2341 ,мне надо их расположить во S> внутренней или внешней памяти начиная с определенного адреса.Как это S> сделать? S> name test S> cseg at 0000h S> org 0000h S> mov dptr,#2341 S> mov r2,dph S> mov r3,dpl S> mov dptr,#2341 S> mov r4,dph S> mov r5,dpl S> mov a,r2 S> add a,r4 S> mov r6,a S> mov a,#0 S> mov a,r3 S> add a,r5 S> mov r7,a S> end

Жуть! Во-первых писать с начала строки нельзя, а то оператор будет считаться как метка. Потом ты старший со младшим байты через dptr раскладываешь, это совсем не к чему, константу можно сразу в регистр заслать. Далее сложение старших байт надо через addc, а то перенос теряется. И порядок сложения сначала младшие, а не наоборот. Я думаю тебе сначала надо ознакомиться с конкретным ассемблером, поглядеть примерчики. Hе знаю какой у тебя асм, но скажем на AD 2500 твой случай так выглядит:

.SYMBOLS .RSECT org 20h summa ds 2 .CODE start: mov a,#<1234 add a,#<1234 mov summa,a mov a,#>1234 addc a,#>1234 mov summa+1,a

В результате младшее значение суммы по адресу 20h, старшее - по 21h

Sergey

дело в том,что первый раз с таким сталкиваюсь,на 4 курсе начался предмет "микропроцессоры" и начали изучать mcs51.Программа отладчик/наладчик/сборщик и т.д. называется Keiltest.Еще куча методичек.Вот сижу изучаю,но трудно дается.А это моя первая лабораторная работа.Надеюсь,ваши ответы мне помогут.Вы уж извините :) Еще раз спасибо.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required