Според това: http://www.8052.com/tutsfr.php , sfrs чийто адрес се дели на 8 са битово адресируеми. Можете да правите неща като SETB или CLR върху тях. Но не се ли припокриват с други адреси на паметта? Имам предвид, например, P0 е след 80 часа. Така че P0.0 ще бъде 80h, P0.1 ще бъде 81h. Но 81h е адреса на SP. Не се ли припокриват?
Защо някои sfr в 8051 са малко адресируеми?
Отговори (2)
Бъркате битов адрес с байтов адрес. Те не се припокриват и не се отнасят за едно и също физическо местоположение. Инструкциите, които приемат битови адреси (напр. SETB), знаят как да декодират битовия адрес в байтов адрес и битово число. Байтовият адрес се получава чрез маскиране на 3-те най-ниски бита в битовия адрес. Номерът на бита се получава чрез маскиране на най-високите 5 бита.
напр. битов адрес 87h --> байтов адрес 80h, бит #7
person
mocj
schedule
09.07.2010
Благодаря ви много за обяснението. Вярно е за SFR. Но какво, ако
SETB 01h
? Трябва да бъде байт адрес #20 и бит #1. Мога ли да кажа, че адресируемата памет с битове и адресируемата с байтове памет са в различно пространство на паметта, което може да се обработва автоматично от хардуер (или въведения)?
- person Grissiom; 10.07.2010
Да, както отбелязахте, процедурата е същата за не-SFR (адреси ‹ 80h), с изключение на това, че има допълнително отместване от 20h, добавено към байтовия адрес. Инструкциите ще обработват адресирането вътрешно, но внимавайте да ги мислите като „различни“ пространства на паметта, те се припокриват. SETB 01h ще зададе бит #1 в място на паметта 20h. Това може да бъде презаписано от байт адресируема MOV инструкция, която е насочена към адрес 20h. MOV 20h,00h. Това ще изчисти битовите адреси от 00h до 07h. Програмист, пази се ;)
- person mocj; 12.07.2010
P0.0 и P0.1 се отнасят само за отделни битове на 8-битовия регистър P0 (доколкото разбирам).
person
leppie
schedule
19.06.2010
Да, но ако са малко адресируеми, в крайна сметка ще имат адрес.
- person Grissiom; 19.06.2010