Написать программу на ассемблере МК51

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 6
Зарегистрирован: Чт май 13, 2010 21:44:29

Сообщение moralis »

(assembler) помогите решить задачу , хотябы разъяснить алгоритм ее решения :

Написать программу на ассемблере МК51, выполняющую действия в соответствии с заданием. Определить необходимый объем РПП и время выполнения программы.
Задание
вычислить логическое выражение для X < E0Н:

V = (X Y + Z & R) & (X & Y & Z + R) & FCH;

По окончании вывести на индикатор (P1) вычисленное значение V.
Размещение переменных в портах и РПД МК51:
X – Р0; Y – Р2; Z – 3FH; R - 40H; V - 41H.

только учусь,пока мало что понятно , заранее спасибо
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

moralis, хочу сказать Вам очевидную вещь, что тут за вас ни кто не станет решать Ваши проблемы... Для того что бы получить грамотную помощь (а не пинок от нойса),надо грамотно поставить вопрос и предложить свои (-й) вариант(ы) решения поставленной задачи. ... Задача не сложная... Как мне кажется ... Вопрос в другом... важно что бы Вы сами научились, а если застрянете, то обитатели форума с радостью помогут Вам. Вот только именно помогут, а не сделают/решат за Вас.
Ваши мысли по данному вопросу....?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Реклама
Родился
Сообщения: 6
Зарегистрирован: Чт май 13, 2010 21:44:29

Сообщение moralis »

К сожелению я учусь заочно и не на програмиста а на железнодорожника. За 2 часа преподователь ничего толком не обьяснил( Быт бы презнателен если бы обетатели форума мне обьяснили как можно справится с этой задачей.
Друг Кота
Аватара пользователя
Сообщения: 3284
Зарегистрирован: Чт окт 08, 2009 00:43:16

Сообщение salyamkamrad »

О чем тут говорить? Если преподаватель требует от Вас рыбы, не научив Вас пользоваться удочкой, то с вероятностью 99% ему от Вас не факт отлова Вами рыбины нужен, а что-то более свободно конвертируемое. Подозреваю, что преподавателю остро нужны деньги :(
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 6
Зарегистрирован: Чт май 13, 2010 21:44:29

Сообщение moralis »

Спасибо за помощ
Реклама
Открыл глаза
Сообщения: 41
Зарегистрирован: Пн дек 21, 2009 15:16:31

Сообщение ujin »

moralis писал(а):Спасибо за помощ
Я думаю вам стоит посмотреть книгу А.В. Фрунзе "Микроконтроллеры? это же просто!"
хотя бы том 1(этого уже будет достаточно для написания вашей программы на ассемблере).тамо по этому микроконтроллеру вполне на понятном русском рассказываеться как ним работать и писать программки, книга читаеться легко и все разжевано.
Реклама
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

как не следует делать...
C51 COMPILER V8.06 TEXT1 05/16/2010 17:24:51 PAGE 1


C51 COMPILER V8.06, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN .\text1.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE .\text1.c DEBUG OBJECTEXTEND CODE SYMBOLS

line level source

1 #include <reg51.h>
2 /*V = (X Y + Z & R) & (X & Y & Z + R) & FCH;
3 *
4 *По окончании вывести на индикатор (P1) вычисленное значение V.
5 *Размещение переменных в портах и РПД МК51:
6 *X – Р0; Y – Р2; Z – 3FH; R - 40H; V - 41H.
7 */
8 #define X P0
9 #define Y P2
10 #define Z 0x3f
11 #define R 0x40
12 #define V 0x41
13 char data k _at_ V;
14 void main(void)
15 { char x,y,z;
16 1 x=X; y=Y;
17 1
18 1
19 1 k=(x*y + z & R) & (x & x & Z + R) & 0xFC;
20 1 P1=k;
21 1 }
C51 COMPILER V8.06 TEXT1 05/16/2010 17:24:51 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE


; FUNCTION main (BEGIN)
; SOURCE LINE # 14
; SOURCE LINE # 15
; SOURCE LINE # 16
;---- Variable 'x' assigned to Register 'R7' ----
0000 AF80 MOV R7,P0
;---- Variable 'y' assigned to Register 'R6' ----
0002 AEA0 MOV R6,P2
; SOURCE LINE # 19
0004 EF MOV A,R7
0005 8EF0 MOV B,R6
0007 A4 MUL AB
0008 2500 R ADD A,z
000A 5440 ANL A,#040H
000C FE MOV R6,A
000D EF MOV A,R7
000E 5F ANL A,R7
000F 547F ANL A,#07FH
0011 5E ANL A,R6
0012 54FC ANL A,#0FCH
0014 F541 MOV k,A
; SOURCE LINE # 20
0016 F590 MOV P1,A
; SOURCE LINE # 21
0018 22 RET
; FUNCTION main (END)

C51 COMPILER V8.06 TEXT1 05/16/2010 17:24:51 PAGE 3

NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====


P0 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0080H 1
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P2 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A0H 1
main . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
x. . . . . . . . . . . . . . . . . . * REG * DATA CHAR 0007H 1
y. . . . . . . . . . . . . . . . . . * REG * DATA CHAR 0006H 1
z. . . . . . . . . . . . . . . . . . AUTO DATA CHAR 0000H 1
k. . . . . . . . . . . . . . . . . . . PUBLIC DATA CHAR 0041H 1


MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 25 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
Родился
Сообщения: 6
Зарегистрирован: Чт май 13, 2010 21:44:29

Сообщение moralis »

Правильно?


Z .equ 03Fh
R .equ 040h
V .equ 041h
R1 .equ 1
R2 .equ 2
R3 .EQU 3

Start: Mov R1, P0
MOV R2, P2
PUSH R1
PUSH R2

ADD R2, R1
MOV R1, FFh
SUBB R1, R2

ANL Z, R
ORL Z, R1
MOV R3, Z

POP R1
POP R2

MOV R1, FFh
SUBB R1, X

ANL R1, Y

ORL Z, R
MOV R2, FFh
SUBB R2, Z

ANL R1, R2

ANL R3, R1

MOV R2, FFh
SUBB R2, R3

ANL R2, FCh

END: MOV P1, R2

JMP START
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

компилятор выдаст кучу ошибок....
Родился
Сообщения: 6
Зарегистрирован: Чт май 13, 2010 21:44:29

Сообщение moralis »

Помогите исправить ошибки
Открыл глаза
Сообщения: 41
Зарегистрирован: Пн дек 21, 2009 15:16:31

Сообщение ujin »

.......а чем вам не понравился код выше.. от FUZZY_..там вот все правильно и сделано согласно вашему на верху заданию....сначало сделано на языке высокого уровня....но ниже то представлен код на ассемблере 51 ядра......
ну уж если и разбирать ваш код то по нему явно наблюдается ошибки зделаные по незнанию ядра микропроцессоров семейства MSC51....
...Я же вам не зря советовал книжку прочитать....так методом тыка и спрашивая здесь что неправильно вы написали, вы затратите намнога больше времени чем на прочтение той замечательной книги....
ну уж если ваш код разбирать.....я попытаюсь для вас прокоментировать то что вы указываете сделать мк командами...
кусок с иницализацией констант оставлю в разных компиляторах он различается:

Z .equ 03Fh
R .equ 040h
V .equ 041h
R1 .equ 1
R2 .equ 2
R3 .EQU 3

1 Start: Mov R1, P0 ---здесь вы говарите мк взять значение из порта Р0 и положить его в регистр РОН R1(регистр общего назначения)
2 MOV R2, P2----------- самое ..только регистр R2 порт P2
3 PUSH R1 --------------команда запись переменной R1 в "стек"
4 PUSH R2 --------------команда запись переменной R2 в "стек"

5 ADD R2, R1----------- команда сложение но эта команда работает со спец. регистром называемый аккумулятор, поэтому это уже ошибка...необходимо одну переменную уложить сначало в аккумулятор а патом командой ADD сложить с тругой переменной...например регистр R1 поместить в аккумулятор и патом сложить с R2.. mov A,R1 , ADD A,R2 что то примерно так должно быть...

6 MOV R1, FFh----------- MOV я расписал на верху, вы помещяете в R1 значение из адреса 0FFH озу...но не как вы хотели уложить туда число 255....это должно выглядеть было так MOV R1,#FFh....если хотите записать куда то число то будьте любезны указать компилятору это символом решетки....

7 SUBB R1, R2--------- это команда называеться "вычитание с заемом", отсюда вопрос сразу а где у вас по вашему заданию нужно было делать вычитание?!....и опять же те грабли что и вверху при сложении..необходимо сначала один операнд поместить в аккумулятор и патом делать вычитание ...mov A,R1 , SUBB A,R2...должно быть было так...

8 ANL Z, R----это команда "логическое И для переменных байтов"..... Z и R у вас коснтанты так надо сначало хотя бы какое то число из этих засунуть в какой нить регистр или аккумулятор и патом делать над ним логическое И....конструкция примено такая....MOV A,#Z; ANL A,#R

9 ORL Z, R1----это команда "логическое или"----первым должен быть стоять байт назначения а патом уж можно ставить константу....естественно опять же забыли про решетку перед числом....ORL R1,#Z...вот так можно было написать...

10 MOV R3, Z----ну здесь та же ошибка при работе с константами...решетка всё таж хренова...MOV R3,#Z..вот так вполне бы прокатило...

11 POP R1----ну тут вы точно не ошиблись написав взять из стека что туда клали в R1
12 POP R2----то же самое что туть выше с R2..

13 MOV R1, FFh---про это я уже писал как правильно это написать что константы и решетка...MOV R1, #FFh.
14 SUBB R1, X---про это я тоже писал...с тем же опять вопросом где это в вашей задачи нужно вычитать....плюс к тому же что компилятор начнет еще и в добавок ругаться что не знает что такое ваша "X" она у вас не описана ни коим образом.

15 ANL R1, Y-----тут тоже вас уже из команды ясно что вы делаете "логическое И" правда непонятно с чем....неописана "Y"

16 ORL Z, R------ошибка см.стоку 8
17 MOV R2, FFh------ошибка см 6
18 SUBB R2, Z-------ошибка см14

19 ANL R1, R2-----это правильная команда вполне прокатит....

20 ANL R3, R1-----это костукция тоже правильная

21 MOV R2, FFh----ошибка см строку6.
22 SUBB R2, R3-----ошибка см строку 14.+ оглядываясь на формулу вашу...

23 ANL R2, FCh-----ошибка см 6.

24 END: MOV P1, R2---это правильно написанный код

25 JMP START-----здесь написать можно 3 способами например AJMP <метка>--абсолютный переход(адрес перехода должен лежать внутри адной страницы объемом 2 Кбайт памяти программы),LJMP <метка> "длинный переход" (адрес перехода может находится по любому адресу в 64 Кбайт), SJMP <метка> "короткий переход" (адрес перехода должен находиться от 128 предшествующих команде или 127 байт следующих за ней)...Есть еще одна команда перехода ...каторая использует DPTR интересно посмотрите сами в дш.....
.....на самом деле еще много чего тута опущено и не показано....потому что из задачи не совсем ясно с какими числами данных вы собираетесь аперировать будь то они одно байтные или двух...ну или не дай бох....еще больше..и тут для написания кода на ассемблере арифметических задач надо подходить по другому......
.....интересно чтож у вас за специальность железнодорожная будет?.......Пытался всё рассказать по железнодорожному как железнодорожник железнодорожнику....может где и ошибся давно асм уже подзабыл ...но ничё народ поправит меня надеюсь...
...и последнее ..все таки найдите книжку которую советовал... сильно облечит вашу жизнь раз у вас препод так всё невнятно про это дело рассказывал....

с уважением.
Родился
Сообщения: 6
Зарегистрирован: Чт май 13, 2010 21:44:29

Сообщение moralis »

Благодарю вас ujin! Обьяснили очень доступно и понятно. Обязательно прочту книгу которую Вы советовали.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»