реклама на сайте
подробности

 
 
> Определение сегментов в KEIL, для ламмера
Dron_Gus
сообщение Feb 25 2005, 16:43
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Ткните носом, что неправильно...

Код
;-------BANK segment
    DSEG AT 00h
RegBnks SEGMENT DATA
    RSEG RegBnks
    org 08h;Bank 1
    DS 2;R0, R1 in bank 1 using for internal
LCD_X:    DS 1;X=R2 in bank 1
LCD_Y:  DS 1;Y=R3 in bank 1
LCD_BS: DS 1;Begining string of LCD

;-------BIT segment
       BSEG AT 20h
BitSeg  SEGMENT BIT
    RSEG BitSeg
LCD_BW:    DBIT 1;0 => White background 1 => Black
LCD_NS: DBIT 1;New string after write
LCD_RC: DBIT 1 ;Return of carriage
LCD_SX: DBIT 1 ;Save X
LCD_SY: DBIT 1 ;Save Y
LCD_M:    DBIT 1 ;1 string in CODE memory, 0 in XRAM

;-------BYTE area
    
    
    
;-------STACK - highest 20h of internal RAM, STACK grows UP
    BSEG AT 60h
STACK    SEGMENT    DATA
    RSEG  STACK
    DS    20H


    USING    0
    CSEG  AT   0
MAIN    SEGMENT    CODE
    RSEG  MAIN
;-------Int Vectors
    ORG 0000h
    ljmp START;start vector
    ORG 006Bh
    ljmp USB_INT;usb interrupt



    ORG 0100h
;-------START
START:    mov SP,#STACK-1


В дебагере вместо

Код
START:    mov SP,#STACK-1

Это
Код
C:0x0100    758120   MOV      SP(0x81),#0x20


Тоже самое с регистрами из 1 го банка. Т.е. если делаем mov LCD_X,#0h а потом переходим к первому банку, в R2 вовсе не 0.

Соостветственно я запутался. Из справки по директивам почти ничего не понял. Т.е. мне кажется после BSEG AT 60h сегмент будет по смещению 60h, но почему-то это не так.

И еще. Почему компилятор придирается к push A, а к push ACC нет?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
acex2
сообщение Feb 25 2005, 17:15
Сообщение #2


Адепт
****

Группа: Свой
Сообщений: 520
Регистрация: 15-02-05
Пользователь №: 2 656



Цитата(Dron_Gus @ Feb 25 2005, 13:43)
Соостветственно я запутался. Из справки по директивам почти ничего не понял. Т.е. мне кажется после BSEG AT 60h сегмент будет по смещению 60h, но почему-то это не так.


BSEG в 8051 - это сегмент для побитно адресуемых данных с адресами в DATA от 0x20 - 0x2F. Поэтому значение 60h тут никак не подходит. Да и стек в этой области обычно не располагают. Обычно стек помещают в сегмент IDATA (директива ISEG), если конечно она физически присутствует в вашем МК. Если нет, то надо использовать директиву DSEG для размещения в любой части области DATA.

Цитата(Dron_Gus @ Feb 25 2005, 13:43)
И еще. Почему компилятор придирается к push A, а к push ACC нет?


Потому что это не совсем одно и то же. "А" означает адрес аккумулятора как ячейки памяти при прямой адресации, а "АСС" - имя аккумулятора как SFR регистра, соответсвенно push по логике работает только с ACC.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Feb 25 2005, 17:55
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(acex2 @ Feb 25 2005, 21:15)
BSEG в 8051 - это сегмент для побитно адресуемых данных с адресами в DATA от 0x20 - 0x2F. Поэтому значение 60h тут никак не подходит. Да и стек в этой области обычно не располагают. Обычно стек помещают в сегмент IDATA (директива ISEG), если конечно она физически присутствует в вашем МК. Если нет, то надо использовать директиву DSEG для размещения в любой части области DATA.


Про А и АСС вроде понял. Только еще один вопрос возник после прочтения ПДФа. Адреса 80h-FFh занимают SFR (direct addressing) и Inderect memory. Push ACC это direct addressing или я опять что-то не понимаю?

А вот со стеком и банками регистров не получается. cranky.gif Не IDATA, не просто DATA не помагают. Пытался все остальные сегменты двигать, смещать... Ничего не помагает. Может какие настройки надо проставить?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
acex2
сообщение Feb 25 2005, 18:43
Сообщение #4


Адепт
****

Группа: Свой
Сообщений: 520
Регистрация: 15-02-05
Пользователь №: 2 656



Цитата(Dron_Gus @ Feb 25 2005, 14:55)
Про А и АСС вроде понял. Только еще один вопрос возник после прочтения ПДФа. Адреса 80h-FFh занимают SFR (direct addressing) и Inderect memory. Push ACC это direct addressing или я опять что-то не понимаю?


PUSH - это индексная адресация wink.gif Вторым параметром идет адрес ячейки от 0 до 0xFF, содержимое которой и будет помещено в стек. Так, для PUSH ACC в стек будет помещаться содержимое ячейки с адресом E0, т.е. текущее содержимое аккумулятора. Точно так же вы можете написать PUSH 0xE0 и это будет то же самое что и PUSH ACC.

P.S. Сейчас только заметил очепятку в пояснении в своем предыдущем сообщении - поменяйте там местами ACC и A, а то действительно непонятно получилось.

Цитата(Dron_Gus @ Feb 25 2005, 14:55)
А вот со стеком и банками регистров не получается. cranky.gif Не IDATA, не просто DATA не помагают. Пытался все остальные сегменты двигать, смещать... Ничего не помагает. Может какие настройки надо проставить?


Должно работать. Вот вам пример стека в IDATA с фиксированным расположением:
Код
ISEG      AT      0xA0
?STACK:   DS      0x20


или если хотите чтобы линкер его сам расположил:

Код
?STACK  SEGMENT  IDATA
        RSEG     ?STACK
        DS       0x20
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 02:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.03293 секунд с 7
ELECTRONIX ©2004-2016