سلام دوستان
من این برنامه ساده رو نوشتم که محتوای آدرس 50 HEX رو بفرستم روی PORTB . زمانی که خود مقدار 50HEX رو میریزم توی رجیستر 16 بیتی Z این عمل انجام نمیشه ( نیم بایت بالای 50H توی R31 و نیم بایت پایین 50H توی R30 میریزم ولی به آدرس 50H اشاره نمیشه ) ولی وقتی به این شکل که اینجا نوشتم با یک بیت شیفت به چپ مقدار دو برابر 50H توی Z ریخته میشه درست به آدرس 50H پرش میکنه و محتوای اوی که رو توی R16 و در نتیجه روی پورت B میریزه.
کسی میدونه چرا باید اون شیفت به چپ انجام بشه؟ جایی از برنامه من مشکل داره یا کلا اینجوری هست که باید دوبرابر آدرس مورد نظر توی اشاره گر ریخته بشه؟
#include "m32def.inc"
.ORG 0X0000
SETUP:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,$FF
OUT DDRB,R16
MAIN:
LDI R31,HIGH(0X50<<1)
LDI R30,low(0x50<<1)
LPM R16,Z
OUT PORTB,R16
RJMP MAIN
.ORG 0X50
.DB $4
من این برنامه ساده رو نوشتم که محتوای آدرس 50 HEX رو بفرستم روی PORTB . زمانی که خود مقدار 50HEX رو میریزم توی رجیستر 16 بیتی Z این عمل انجام نمیشه ( نیم بایت بالای 50H توی R31 و نیم بایت پایین 50H توی R30 میریزم ولی به آدرس 50H اشاره نمیشه ) ولی وقتی به این شکل که اینجا نوشتم با یک بیت شیفت به چپ مقدار دو برابر 50H توی Z ریخته میشه درست به آدرس 50H پرش میکنه و محتوای اوی که رو توی R16 و در نتیجه روی پورت B میریزه.
کسی میدونه چرا باید اون شیفت به چپ انجام بشه؟ جایی از برنامه من مشکل داره یا کلا اینجوری هست که باید دوبرابر آدرس مورد نظر توی اشاره گر ریخته بشه؟
#include "m32def.inc"
.ORG 0X0000
SETUP:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,$FF
OUT DDRB,R16
MAIN:
LDI R31,HIGH(0X50<<1)
LDI R30,low(0x50<<1)
LPM R16,Z
OUT PORTB,R16
RJMP MAIN
.ORG 0X50
.DB $4
دیدگاه