Slava93
Гость
|
|
« : 19-06-2007 05:55 » |
|
Добрый день ! Скажите пожалуйста , почему не работает инструкция следующего вида в Keil uVision3
BUFFER SEGMENT IDATA ......................
MOV R1,#10H MOV R0,#UKAS
LABEL: MOV @RO,#AAH INC R0 DJNZ R1,LABEL SJMP $
RSEG BUFFER
UKAS: DS 10H
При компиляции выдает ошибку A45:UNDEFINED SYMBOL ( PASS-2) и указывает на строку LABEL:MOV @R0,#AAH
Как сделать правильно ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 19-06-2007 06:24 » |
|
тут LABEL: MOV @RO,#AAH у тебя в R0 - стоит буква o или цифра 0 ?
|
|
|
Записан
|
|
|
|
Slava93
Гость
|
|
« Ответ #2 : 19-06-2007 06:37 » |
|
Стоит R0 , то есть цифра. Интересует понимает компилятор такой указатель ? По идее на втором проходе он должен знать , какой конкретно адрес выделен под буфер во внутреннем ОЗУ контроллера ( AT89C51).
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 19-06-2007 06:53 » |
|
должен, я думаю, понимать. Но всё таки проверь прямо в коде - не опечатка ли там у тебя с нулём
>>По идее на втором проходе он должен знать , какой конкретно адрес выделен под - это же регистр, при чём тут второй проход.
И ещё один тестик - закомментируй строку LABEL: ; MOV @RO,#AAH , скомпилится ли без неё ?
зы контроллер я в руках не держал, поэтому лишь предполагаю ...
|
|
« Последнее редактирование: 19-06-2007 07:00 от Алексей1153++ »
|
Записан
|
|
|
|
Slava93
Гость
|
|
« Ответ #4 : 19-06-2007 08:29 » |
|
Если просто написать :
mov r0,#UKAS
JMP $
то все нормально , регистру R0 присваивается значение 08h. Компилятор ругается на инструкцию
mov @R0, AAh
Чего ему не хватает ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 19-06-2007 08:33 » |
|
mov @R0, AAh если правильно помню, то это значит использовать регистр с адресом AA. А если поставить # - это уже константа. Slava93, а почему у тебя от строчки к строчке меняется написание ? - - то же самое насчёт опечатки (даже если её и не было) - в одномм месте написано MOV @RO... в другом MOV @R0... СКОПИРУЙ сюда через БУФЕР ОБМЕНА реальный кусок своего кода И ещё - регистр литер не влияет ли ? Может не R0 надо , а r0 ?
|
|
« Последнее редактирование: 19-06-2007 08:35 от Алексей1153++ »
|
Записан
|
|
|
|
Slava93
Гость
|
|
« Ответ #6 : 19-06-2007 08:58 » |
|
Все разобрался ! Ошибка была в том , что если константа начинается не с десятичной цифры , то надо добавлять 0 !
То есть MOV @R0,#0AAH
А если MOV @R0,#AAH
то компилятор дает ошибку.
Спасибо Алексей , что натолкнули в нужном направлении !
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 19-06-2007 09:39 » |
|
по большому счету рекомендую применять следующую конструкцию, как ты и писал: mov r0,#UKAS это даст возможность не искать константы в теле программы и не возникло бы такой ашипки. Алексей1153++, не путай народ mov @R0, ... если правильно помню, то это значит использовать регистр с адресом AA. А если поставить # - это уже константа.
Правильно: по адресу в R0 положить... А вообще-то типичная ошибка, к сожалению
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 19-06-2007 09:50 » |
|
Sla, во первых, цитату ты не до конца привёл ) Я говорил именно про #AA , а не про mov @r0. И в зависимости от решётки, второй операнд понимается как константа или как регистр с таким адресом
А что я могу ошибаться , это я и так сказал.
|
|
|
Записан
|
|
|
|
Slava93
Гость
|
|
« Ответ #9 : 19-06-2007 10:16 » |
|
Посмотрел код , который скомпилировал Keil и возникли сомнения Вот что получилось
mov R1,#10H MOV R0,#08H
LABEL: MOV @R0,#0AAH INC R0 DJNZ R1,LABEL SJMP $
Вроде все нормально , но банк регистров при сбросе устанавливается нулевой , а R0 компилятор назначил адрес из 1-го банка . То есть в инструкции MOV @R0, #0AAH процессор должен обратиться по адресу в ОЗУ 00H , а не 08h как следовало ожидать ? Причем инструкция USING 0 была использована. То есть компилятор должен был добавить команду SETB RS0 в этом случае или присвоить R0 значение 00h . Верны ли мои опасения?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #10 : 19-06-2007 10:57 » |
|
Компилятор ничего не должен добавлять! инструкция только для того чтоб компилятор понимал с каким банком в данном куске кода он работает!
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #11 : 19-06-2007 11:05 » |
|
давай разберемся
mov R1,#10H; R1<-010H MOV R0,#08H; R0<-08H
LABEL: MOV @R0,#0AAH ;по адресу в R0 положить #0AAH , т.е. с 8-го алреса ты будешь заполнять ячейки INC R0 ;следующий адрес 7; последний: 0-1 = 254 DJNZ R1,LABEL ; всего 10 циклов SJMP $ ; а здесь прикольно, даже можно применить JMP - компилятор сам поймет что это короткий адрес
зы првда я с Keil не работал
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #12 : 20-06-2007 06:18 » |
|
м-да, это диагноз INC R0 ;следующий адрес 7; последний: 0-1 = 254 полночи мучался, вертелся попутал декремент с инкрементом
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|