С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микропроцессоры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
1

При записи в регистр меняется содержимое соседнего (ASM, Intel 8051)

21.08.2015, 17:03. Показов 1567. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте

Я написал программу - в этом куске
Assembler
1
2
3
4
5
6
7
8
9
CmcCommand:
 ;---------------Tuning settings, must be commented in real chip work!
                        ;mov MCON, #061H                         ;initial setting MCON (just for tuning it set M-RI=1(all message is received, receive mode must be reset)) must be commented later
                        ;mov MCON, #062H                         ;initial setting MCON (just for tuning it set M-CI=1(received command, required program proceccing)) must be commented later
                        mov MCON, #06AH                         ;initial setting MCON (just for tuning it set M-CI=1, M-RW=1 (need transmit data Term-Bus)
                        mov MCOD, #005H                         ;5 data words
                        nop
                        mov MSUB, #003H                         ;3 subaddress
                        jmp CommandOverride                     ;don't recognize command interface management
при занесении в регистр MCON содержимое становится равно 6А, и таким и остается - т.е это правильно

а при занесении 5 в MCOD становится одновременно = 5 в Регистрах MCOD и MSUB, затем при занесении 3 в MSUB становится одновременно = 3 в Регистрах MCOD и MSUB, т.е неправильно.

Помогите пожалуйста, понять в чем тут дело?

тут полный текст модуля
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
;THIS PROGRAM created  for be used for Cmc bus interchange
;Logic: it load counter of array cells, then set Data pointer to the last cell, put it to the ACC and add shift to the ACC, and result will be address of the last cell. Read last cell to the acc, and the same way find address of destination cell and load  to read shift to the acc  pointer read the last cell from ROM, put it in ACC getthe main is for
;---------------------2015-aug-07--------------------------------
;add in module
;----------------------settings section
                        .MOD51                          ;declare chip model
;--------------------------------------------------------------------------------------
                       .rseg Bts,bit                            ;start of bit section
                        .EXTRNT  Timerlongperiod
                        ;.extrnt  MCON
                        .ENDSEG                                 ;ends of bit section
;--------------------------- ;start of data section-------------------------
;======================== segment for constants and tables in ROM: =;
                        .rseg Const,code            ;declare segment Const
                        ;Table of  eight 8-bit integer value (in decimal)
                        TableByte .dcb 11,22,33,44,55,66,77,88     ;Array source 0B,16,21 2C,37,42,4D,58 transfered to hex
                        EndOfTableByte .dcb 2                       ;label array end
                        MyString1  .dcb 'MCA-51 Assembler Example', 30 ;declare string variable and load
                        EndOfMystring1 .dcb 2                       ;label array end
                        .endseg
;------------------------start data segment in RAM--------------------------
                         .RSEG uni_DATA,data
                         TableByte_dest .DSB 8      ;ARRAY in RAM of 8 elements  (if in bit, can be accessible by point avftr name:)TableByte_dest.0, TableByte_dest.1
                         IRAM_ARRAY_END .DSB 1       ;for ethereal program - end of program adreess
                        .extrn (data) Timer10sec                 ;DECLARE variable
                        .extrnb (sfrs) MCON, MSTS, MERG, MCNT, MRXA, MTXA, MBA, MBD, MCOD, MSUB, MLCL, MLCH
                        .BYTE Timer10sec                          ;data, BYTE, unsigned char
                        .TYPE   Timer10sec (.uchar)             ;îáúÿâëåíèå type unsigned char
                        .ENDSEG                                 ;ends of data section
;--------------------------------------------
                        .RSEG uni_CODE,code ;start of code section
                        .public  CmcCommand                    ;interruption processing module
                        .EXTRN (code) TransmitData, ReceiveData
;------------------------START initial settings
Init:
                        accum .SET Acc                          ;set symbol name "accum" to A register (it's just for joke and can be removed later)
  ;------------------end of tuning settings
 CmcCommand:
 ;---------------Tuning settings, must be commented in real chip work!
                        ;mov MCON, #061H                         ;initial setting MCON (just for tuning it set M-RI=1(all message is received, receive mode must be reset)) must be commented later
                        ;mov MCON, #062H                         ;initial setting MCON (just for tuning it set M-CI=1(received command, required program proceccing)) must be commented later
                        mov MCON, #06AH                         ;initial setting MCON (just for tuning it set M-CI=1, M-RW=1 (need transmit data Term-Bus)
                        mov MCOD, #005H                         ;5 data words
                        nop
                        mov MSUB, #003H                         ;3 subaddress
                        jmp CommandOverride                     ;don't recognize command interface management
 ;-------------------------recognition of command (interruption reason)------------
;command1:               cjne MCOD, #000H, command2      ;DBC - take interface control
                        nop                             ;
;command2:              ;cjne MCOD,#00000001b,command3      ;S- syncronisation
                        nop
;command3:              cjne #MCOD,#00011b,command4      ;IST - START SELF check terminal device
                        nop
;command4:              cjne MCOD,#00100b,command5      ;TS - transmitter stop
                        nop
;command4a:             cjne MCOD,#00101b,command5a     ;OTS - override transmitter stop
                        nop
;command5:              cjne MCOD,#01000b,command6      ;RRT - reset to ready
                        nop
;command6:              cjne MCOD,#10001b,command7      ;S - syncronisation with data word
                        nop
;command7:              cjne MCOD,#10100b,command8      ;STS - secondary transmitter stop
                                nop
;command8:              c      jne MCOD,#10101b,command9      ;OSTS - override secondary transmitter stop|
                        nop
 ;------------------------end of command recognition----------------
CommandOverride:          ;probably don't need to execute interface command?
                mov A, MCON                        ;check if 4 bit =1
                jnb Accum.4, Receive              ;if not "1", then go to recieveing from CMC bus
                call TransmitData               ;transmit data module
Receive:        call ReceiveData                ;receive data module
 ;--------------------------------TRANSFER Ethereal-------------------------------
 ;               MOV DPTR,#TableByte-1         ;load to data pointer start address of source array one before array starts (why?)
 ;               MOV R0,#IRAM_ARRAY_END        ;load to R0 address of the end of destination array
 ;               MOV R1,#8                     ;load element counter
 ;               INIT_IRAM_ARRAY:              ;start subroutine to transfer cells
 ;               DEC R0                        ;decremrnt adress step up the end of destination array it point to the end of array
 ;               MOV A,R1                      ;load shift to cells, started from last cell
 ;               MOVC A,@A+DPTR                ;load cell to accum from address from end of ROM array
 ;               MOV @R0,A                     ;load cell into destination cell
 ;               DJNZ R1,INIT_IRAM_ARRAY       ;loop while the first  cell will be achieved (reached)
 ;-------------------------------------end of ethereal transfer------------------
                ret
                .ENDSEG                                         ;ends of code section
                .END                                            ;äèðåêòèâà îêîí÷àíèÿ òðàíñëÿöèè
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2015, 17:03
Ответы с готовыми решениями:

Определение минимального элемента в массиве (Intel 8051, ASM, Keil uVision4)
Задача: Составьте программу на языке ассемблера, которая реализует алгоритм решения Определение...

С BASIC на ASM, 8051
задали, и здать нужно срочно, напишите что знаете, пожалуйста 1.Реализовать на ассемблере...

8051+asm, нужна подсказка
Добрый вечер. Никак не могу понять как можно сделать умножение двух четырехразрядных чисел,...

Стэк asm 8051 AT89C52
Добрый день, коллеги! Делаю лабу в ВУЗе по микроконтроллерам. Накопилось несколько вопросов,...

8051. Сравнение скорости ASM и С в симуляторе
Здравствуйте нужно на примере простой функции (вычитание 6ти-значных чисел) сравнить...

10
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
23.08.2015, 08:39 2
Так словами то расскажи как твоя программа работает.
Вот она стартовала, доползла от метки Init до jmp CommandOverride, прыгнула на метку CommandOverride, поползла дальше, выполнила или нет подпрограмму call TransmitData и вернулась если выполнила, выполнила подпрограмму call ReceiveData и вернулась, доползла до
Цитата Сообщение от design_m Посмотреть сообщение
;-------------------------------------end of ethereal transfer------------------
ret
.ENDSEG ;ends of code section
.END
вот до этой ret и по ней вернулась куда ? К --- ?
1
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
23.08.2015, 09:51  [ТС] 3
Цитата Сообщение от Ethereal Посмотреть сообщение
как твоя программа работает
так она пока никак и не работает, это просто модуль, который вызывается из Main (я его в других своих вопросах опубликовывал)
а пока она ничегоне делает, кроме как заносить в регистры эти константы, (там ведьесть комментарии по каждой команде).
Потом

Добавлено через 2 минуты
смысл вопроса - в том, что она почему-то заносит константу сразу в 2 регистра, хотя в первый регистр заносится все нормально. А я ведь все одинаково написал, и поэтомуне пойму, где у меня ошибка.

Добавлено через 4 минуты
Цитата Сообщение от Ethereal Посмотреть сообщение
К ---?
Ну,так она в Main возвращается. Яего простоне стал помещать, чтобы столку не сбивать.
Меня же только эти 3 оператора интересовали, которые заносят в регистры, но почему то один - нормально, а те 2 - попарно, хотя, мне кажется, синтаксис везде одинаковый?
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
24.08.2015, 06:07 4
Цитата Сообщение от design_m Посмотреть сообщение
Ну,так она в Main возвращается.
Нет. Если она из Main по call не вызывалась и пришла по jmp, то она по ret возвращается к ---. Смысла искать почему записывает в 2 регистра нет, если программа через зад написана. Она непредсказуемо исполнять будет черт знает что и писать при этом будет черт знает куда. И нету смысла выяснять почему именно сюда, а не туда и почему именно это, а не то.

Добавлено через 59 минут
Я уже всю клавиатуру стер, объясняя, что ret с пустого стека скорей всего приведет к возврату на адрес 0. Т.е. через жопу возврат на Main, но будет. Да только на каждом обороте этого "через жопу" стек будет сдвигаться. А значит адрес возврата при вызове call ReceiveData будет писаться во все новые и новые адреса, заполняя собою память. MCON MCOD MSUB он тоже может заполнить, хотя это и не предсказуемо.

Десять раз уже было сказано - если написано через жопу, то так и работает.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
24.08.2015, 10:14  [ТС] 5
Цитата Сообщение от Ethereal Посмотреть сообщение
Нет. Если она из Main по call не вызывалась
c чего ты это взял ?

Добавлено через 1 минуту
Цитата Сообщение от design_m Посмотреть сообщение
это просто модуль, который вызывается из Main
я выше писал об этом
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
24.08.2015, 11:18  [ТС] 6
Цитата Сообщение от design_m Посмотреть сообщение
но почему то один - нормально,
Он просто был один из группы, как выяснилось, состоящей из 4-х регистров. И данные заносится во все 4 почему-то.

Добавлено через 7 минут
просто эти ячейки сгруппировались в группы по 4, 5, 2, 2 ячейки и запись в любую ячейку группы приводит к записи в остальные ячейки группы.
А непонятно, какой признак их обьединяет? Определены они все одинаково.
Миниатюры
При записи в регистр меняется содержимое соседнего (ASM, Intel 8051)  
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
25.08.2015, 17:50 7
Цитата Сообщение от design_m Посмотреть сообщение
c чего ты это взял ?
С того, что просматривая по диагонали твой исходник вызова call на метку Init не увидел. Потому-что исходник не весь. Зато увидел такой комментарий
Цитата Сообщение от design_m Посмотреть сообщение
;start of code section
Есс-но после этого подумал, что это стартовая точка программы. Комментарий Start of code section и метка Init - что это может быть еще ?
Цитата Сообщение от design_m Посмотреть сообщение
Сообщение от design_m
это просто модуль, который вызывается из Main
я выше писал об этом
Такие писания при прочтении на автомате игнорируются как безграмотные. Вызывается подпрограмма, а модуль - это не более чем кусок текста программы, компилируемый отдельно. Он может вообще не содержать кода или, наоборот, содержать кучу разных подпрограмм.

В результате всего этого я ошибся. Короче, как объясняешь, так тебя и понимают.

Добавлено через 7 минут
З.Ы.
Если ты написал директиву
.RSEG uni_CODE,code
не надо комментировать ее ;Start of code section, Это все равно, что написать
MAСЛО масляное ;МАСЛО МАСЛЯНОЕ
Писать
ADD AX,BX ; Прибавить BX к AX
это и есть такое масло масляное.

Комментировать надо три вещи
- вехи в коде (например Секция_инициализации Главный_цикл Начал_передачу Обработка_прерывания_по приему)
- входные_параметры/выходные_результаты (например Результат_рассчета_CRC_этой_подпрограммой_будет_в аккамуляторе)
- неочевидные для других места (например Флаг_переноса_тут_нулевой_ибо_после_предыдущей_подпрограммы_это_всегда_так)

Остальное другой программист прочитает и без твоих комментариев.
1
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
25.08.2015, 17:57  [ТС] 8
Цитата Сообщение от Ethereal Посмотреть сообщение
Start of code section и метка Init
НУ просто это учебный модуль, я его из MAIN сделал. Секция кода - это наверно, раздел где определяются сегменты памяти в PROM, ведь его область "сode"
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
25.08.2015, 17:59 9
Лучший ответ Сообщение было отмечено design_m как решение

Решение

Проблема в том, что, судя по всему, программистов, которые бы работали с этими MCON MCOD MSUB здесь нет. Очень уж экзотический вариант камня. Так-что помочь тебе трудно.
1
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
25.08.2015, 22:18 10
На правах модератора:
Цитата Сообщение от design_m Посмотреть сообщение
c чего ты это взял ?
Давайте более корректно обращаться с людьми которые пытаются помочь
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
26.08.2015, 11:45  [ТС] 11
Цитата Сообщение от Ethereal Посмотреть сообщение
ADD AX,BX ; Прибавить BX к AX
покажи мне, в каком месте ты увидел, что я пишу
Assembler
1
mov A, @DPTR   ;передать из регистра, расположенного по адресу, содержащемуся в регистре указателя данных в регистр аккумулятора
?

Добавлено через 5 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
возвращается к ---.
уверяю тебя, она к -- вовсе не возвращается. И даже если бы и возвращалась к ---, это не имеет абсолютно никакого отношения к тому, что симулятор показывает изменение содиржимого сразу в 2х или 4 или 5 ячейках памяти.
Этот кусок программы с записью в регистры абсолютно правильный, либо покажи мне, в чём заключается моя ошибка?

Добавлено через 5 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
если написано через жопу
Как оказалось, написано вполне корректно и правильно работает.

Добавлено через 1 минуту
Цитата Сообщение от Витальич Посмотреть сообщение
Давайте более корректно
Уж корректнее меня обращаться невозможно.

Добавлено через 2 минуты
Цитата Сообщение от Витальич Посмотреть сообщение
с людьми которые пытаются помочь
а давайте не путать попытки помочь с попытками возвыситься в собственных глазах за счет попытки унизить противника и указать ему на его ничтожество.
0
26.08.2015, 11:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2015, 11:45
Помогаю со студенческими работами здесь

Формирователь меандра с частотой 36 кГц (8051, Proteus, ASM)
Задача мне была задана такая: на выходе порта P1.1 сформировать меандр с частотой 36 кГц, тактовая...

При обновлении textbox меняется его содержимое
Добрый день. Столкнулся с такой проблемой. На форме создано два textBox,в первый вводится текст,а...

Intel 8051
1 В сегменте CODE помещена строка-константа неопределенной длины, но для строки задан конечный...

При повторном обращении к объекту меняется его содержимое
Добрый день! У меня такая странная проблема: есть две одинаковые строчки кода подряд: cout <<...

Intel 8051. УСАПП
Добрый вечер, может быть кто нибудь показать как реализуется УСАПП с асинхронным режимом. Не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru