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

 
 
> Определение сегментов в 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
Ответов
Dron_Gus
сообщение Feb 25 2005, 21:03
Сообщение #2


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

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



Как оказалось это еще не все.

Хочу читать/писать регистры 1го банка не переключаясь. Т.е.:
Код
    DSEG AT 00h
RegBnks:    
    org 08h;Bank 0
    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


На что мне возражают:

Код
*** WARNING L4: DATA SPACE MEMORY OVERLAP
   FROM:    0000H
   TO:      000CH
*** WARNING L4: DATA SPACE MEMORY OVERLAP
   FROM:    0008H
   TO:      000CH


Как я понял оугается на перекрытие. От этого можно как-либо избавится? Или просто игнорировать?


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


Частый гость
**

Группа: Свой
Сообщений: 88
Регистрация: 15-10-04
Из: Новочеркасск
Пользователь №: 886



Размещение абсолютного сегмента данных с адреса "0" в данном случае не совсем корректно, т.к. там размещен нулевой и, в Вашем случае, наверное первый банки регистров. Компоновщик на это мягко ругается, т.е. "в принципе можно, но имейте в виду..."

Как вариант - можно отказаться от описания сегмента "DSEG AT 0" и использовать описания типа
Код
LCD_X     DATA 0Ah   ;X=R2 in bank 1
LCD_Y     DATA 0Bh   ;Y=R3 in bank 1

mov  LCD_X,#1  ; помещает в ячейку 0Аh значение "1"


Кроме того, вместо адресов регистров банка, выбранного директивой "using", можно использовать имена "AR0"..."AR7", например
Код
using 1
...
push AR0    ; сохраняет в стеке содержимое ячейки 8
...
using 2
pop  AR0    ; восстанавливает из стека содержимое ячейки 10h
...
using 0

Фактического переключения банков при этом не происходит
Go to the top of the page
 
+Quote Post



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

 


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


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