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

 
 
> Определение сегментов в 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



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

 


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


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