درود
تعریف متغییر تو بیسکام یک سری ریزه کاری هایی داره که کمتر بهش توجه میشه
این مقاله برای تعیین نحوه استفاده از فانکشن OVERLAY است
همچنیین به لینک های زیر توجه شود
http://avrhelp.mcselec.com/dim.htm?zoom_highlightsub=dim
http://avrhelp.mcselec.com/language_fundamentals.htm
همه مثال ها در سیمولاتور بیسکام اجرا شده اند
جدول حافظه میتواند خیلی به درک نحوه کار OVERLAY در بیسکام کمک کند
میتوانید کاراکتر خالی (Null termination) را در آخر یک strings و OVERLAY انرا ببینید
شما میتوانید مقادیر جدول حافظه را در طول اجرا برنامه در سیمولاتور مانند شکل زیر ببینید

$regfile = ”m644pdef.dat”
$crystal = ۴۰۰۰۰۰۰
$hwstack = ۶۰
$swstack = ۶۰
$framesize = ۶۰
وقتی متغییر بزرگ تعریف میکنیم مانند string فضای فریم میتواند به سرعت پرشود
$baud = ۹۶۰۰
$sim ’این دستور به کامپایلر میفهماند که برنامه فقط در سیمولاتور اجرا میشود
Print ”——————& mdash;—-”
Dim Array(5) As Byte
Dim My_string As String * ۴ At Array Overlay
تعریف یک متغییر از نوع string درون فضایی که متغییر array تعریف شده با استفاده از ادرس array
Dim K As Byte
K = ۱
My_string = ”Test”
برای چهار حرف کد اسکی ۵ بایت از حافظه اشغال میشود و بایت پنجم یک مقدار خالی را برای تعیین خاتمه استرینگ نگهداری میکند
این متغییر چگونه در حافظه sram قرار میگیرد
Array(5) =00
Array(4) =t
Array(3) =s
Array(2) =e
Array(1) =t
Print Chr(array(1))
Print Chr(array(2))
Print ”——————& mdash;—-”
Dim Teststring As String * ۵
Dim Ar(6) As Byte At Teststring Overlay
Dim J As Byte
J = &H03
Ar(5) = ۴۷
Teststring = ”Hello”
برای ۵ حرف کد اسکی ۶ بایت از حافظه اشغال میشود و بایت ششم یک مقدار خالی را برای تعیین خاتمه استرینگ نگهداری میکند’
این متغییر چگونه در حافظه sram قرار میگیرد
Ar(6) =00
Ar(5) =o
Ar(4) =l
Ar(3) =l
Ar(2) =e
Ar(1) =h
For K = ۱ To ۵
Print Chr(ar(k)) ;
Next
Print
K = ۱
Print ”——————& mdash;—-”
Dim My_word As Word
Dim Low_byte As Byte At My_word Overlay
Dim High_byte As Byte At My_word + ۱ Overlay
استفاده از نام متغییر اصلی بعنوان آدرس برای متغییر overlay
Low_byte = &B0000_1111
High_byte = &B1111_0000
جدول زیر محل قرار گیری متغییر ها در متغییر اصلی را نشان داده شده
my_word
High_byte Low_byte
1111_0000 0000_1111
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
my_word
Low_byte High_byte
0000_1111 1111_0000
Print ”My_word = ” ; Bin(my_word)
Print ”——————& mdash;—-”
Dim My_long_1 As Long
Dim Byte_1 As Byte At My_long_1 Overlay
Dim Byte_2 As Byte At My_long_1 + ۱ Overlay
Dim Byte_3 As Byte At My_long_1 + ۲ Overlay
Dim Byte_4 As Byte At My_long_1 + ۳ Overlay
Byte_1 = ۱
Byte_2 = ۲
Byte_3 = ۳
Byte_4 = ۴
Print Bin(my_long_1)
جدول زیر محل قرار گیری متغییر ها در متغییر اصلی را نشان داده شده
my_long_1
Byte_4 Byte_3 Byte_2 Byte_1
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
my_long_1
Byte_1 Byte_2 Byte_3 Byte_4
Print ”——————& mdash;—-”
Dim My_dword As Dword At $۱۴۰
‘
یک مکان ثابت از ادرس ۱۴۰ برای متغییر My_dword از نوع dword
Dim Byte__1 As Byte At $۱۴۰ Overlay
Dim Byte__2 As Byte At $۱۴۱ Overlay
Dim Byte__3 As Byte At $۱۴۲ Overlay
Dim Byte__4 As Byte At $۱۴۳ Overlay
تعریف متغییر بصورت overlay با استفاده از آدرس دهی مستقیم
Byte__1 = ۱
Byte__2 = ۲
Byte__3 = ۳
Byte__4 = ۴
جدول زیر محل قرار گیری متغییر ها در متغییر اصلی را نشان داده شده
DWORD
Byte_4 Byte_3 Byte_2 Byte_1
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
DWORD
Byte_1 Byte_2 Byte_3 Byte_4
Print ”my_dword = ” ; Bin(my_dword)
Print ”——————& mdash;—-”
Dim My_dword_2 As Dword
Dim My_word_2 As Word At My_dword_2 Overlay
Dim My_byte3 As Byte At My_dword_2 + ۲ Overlay
Dim My_byte4 As Byte At My_dword_2 + ۳ Overlay
My_word_2 = &B11111111_00000000
My_byte3 = &B00000011
My_byte4 = &B10000000
جدول زیر محل قرار گیری متغییر ها در متغییر اصلی را نشان داده شده
my_dword_2
Byte_4 Byte_3 my_word_2
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
my_dword_2
my_word_2 Byte_3 Byte_4
Print Bin(my_dword_2)
Print ”——————& mdash;—-”
آزمایش در ارتباط با کاراکتر خالی پایانی (Null terminator ) در متغییر string
Dim My_date(11) As Byte ’
۸ کاراکتر string بهمراه ۳ کاراکتر خالی پایانی که برابر است با ۱۱ بایت
Dim Day As String * ۲ At My_date(1) Overlay
Dim Null_terminator As Byte At My_date(1) + ۲ Overlay ’Null terminator
Dim Month As String * ۲ At My_date(1) + ۳ Overlay
Dim Null_terminator_2 As Byte At My_date(1) + ۵ Overlay ’Null terminator
Dim Year As String * ۴ At My_date(1) + ۶ Overlay
Dim Null_terminator_3 As Byte At My_date(1) + ۱۱ Overlay ’Null terminator
Day = ”۱۶″
Month = ”۱۱″
Year = ”۲۰۱۱″
Print ”Day= ” ; Day
Print ”Month= ” ; Month
Print ”Year= ” ; Year
برای مثال فانکشن print کاراکتر خالی پایانی رو برای تعیین اخر کلمه (string) استفاده میکند
وقتی ما این کاراکتر را بجای ۰ با “/” بار میکنیم فانکشن print ارسال ادامه میدهد تا به یک کاراکتر پایانی خالی (Null terminator) برسد
Null_terminator = ۴۷
’۴۷= ”/”
Print Day
در این مورد دستور print بجای اینکه مقدار “۱۶″ را ارسال کند مقدار”۱۶/۱۱″ را ارسال می کند به دلیل اینکه اولین کاراکتر پایانی خالی بعد از متغییر ماه “۱۱″ پیدا میکند
End
http://kitboard.com/%D9%85%D8%AB%D8%A7%D9%84-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-overlay-%D8%AF%D8%B1-%D8%A8%DB%8C%D8%B3%DA%A9%D8%A7%D9%85.html
تعریف متغییر تو بیسکام یک سری ریزه کاری هایی داره که کمتر بهش توجه میشه
این مقاله برای تعیین نحوه استفاده از فانکشن OVERLAY است
همچنیین به لینک های زیر توجه شود
http://avrhelp.mcselec.com/dim.htm?zoom_highlightsub=dim
http://avrhelp.mcselec.com/language_fundamentals.htm
همه مثال ها در سیمولاتور بیسکام اجرا شده اند
جدول حافظه میتواند خیلی به درک نحوه کار OVERLAY در بیسکام کمک کند
میتوانید کاراکتر خالی (Null termination) را در آخر یک strings و OVERLAY انرا ببینید
شما میتوانید مقادیر جدول حافظه را در طول اجرا برنامه در سیمولاتور مانند شکل زیر ببینید

$regfile = ”m644pdef.dat”
$crystal = ۴۰۰۰۰۰۰
$hwstack = ۶۰
$swstack = ۶۰
$framesize = ۶۰
وقتی متغییر بزرگ تعریف میکنیم مانند string فضای فریم میتواند به سرعت پرشود
$baud = ۹۶۰۰
$sim ’این دستور به کامپایلر میفهماند که برنامه فقط در سیمولاتور اجرا میشود
Print ”——————& mdash;—-”
Dim Array(5) As Byte
Dim My_string As String * ۴ At Array Overlay
Dim K As Byte
K = ۱
My_string = ”Test”
این متغییر چگونه در حافظه sram قرار میگیرد
Array(5) =00
Array(4) =t
Array(3) =s
Array(2) =e
Array(1) =t
Print Chr(array(1))
Print Chr(array(2))
Print ”——————& mdash;—-”
Dim Teststring As String * ۵
Dim Ar(6) As Byte At Teststring Overlay
Dim J As Byte
J = &H03
Ar(5) = ۴۷
Teststring = ”Hello”
این متغییر چگونه در حافظه sram قرار میگیرد
Ar(6) =00
Ar(5) =o
Ar(4) =l
Ar(3) =l
Ar(2) =e
Ar(1) =h
For K = ۱ To ۵
Print Chr(ar(k)) ;
Next
K = ۱
Print ”——————& mdash;—-”
Dim My_word As Word
Dim Low_byte As Byte At My_word Overlay
Dim High_byte As Byte At My_word + ۱ Overlay
Low_byte = &B0000_1111
High_byte = &B1111_0000
my_word
High_byte Low_byte
1111_0000 0000_1111
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
my_word
Low_byte High_byte
0000_1111 1111_0000
Print ”My_word = ” ; Bin(my_word)
Print ”——————& mdash;—-”
Dim My_long_1 As Long
Dim Byte_1 As Byte At My_long_1 Overlay
Dim Byte_2 As Byte At My_long_1 + ۱ Overlay
Dim Byte_3 As Byte At My_long_1 + ۲ Overlay
Dim Byte_4 As Byte At My_long_1 + ۳ Overlay
Byte_1 = ۱
Byte_2 = ۲
Byte_3 = ۳
Byte_4 = ۴
Print Bin(my_long_1)
my_long_1
Byte_4 Byte_3 Byte_2 Byte_1
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
my_long_1
Byte_1 Byte_2 Byte_3 Byte_4
Print ”——————& mdash;—-”
Dim My_dword As Dword At $۱۴۰
‘
یک مکان ثابت از ادرس ۱۴۰ برای متغییر My_dword از نوع dword
Dim Byte__1 As Byte At $۱۴۰ Overlay
Dim Byte__2 As Byte At $۱۴۱ Overlay
Dim Byte__3 As Byte At $۱۴۲ Overlay
Dim Byte__4 As Byte At $۱۴۳ Overlay
تعریف متغییر بصورت overlay با استفاده از آدرس دهی مستقیم
Byte__1 = ۱
Byte__2 = ۲
Byte__3 = ۳
Byte__4 = ۴
جدول زیر محل قرار گیری متغییر ها در متغییر اصلی را نشان داده شده
DWORD
Byte_4 Byte_3 Byte_2 Byte_1
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
DWORD
Byte_1 Byte_2 Byte_3 Byte_4
Print ”my_dword = ” ; Bin(my_dword)
Print ”——————& mdash;—-”
Dim My_dword_2 As Dword
Dim My_word_2 As Word At My_dword_2 Overlay
Dim My_byte3 As Byte At My_dword_2 + ۲ Overlay
Dim My_byte4 As Byte At My_dword_2 + ۳ Overlay
My_word_2 = &B11111111_00000000
My_byte3 = &B00000011
My_byte4 = &B10000000
my_dword_2
Byte_4 Byte_3 my_word_2
وقتی شما با استفاده از دستور print bin(Variable) متغییر را ارسال میکنید ترتیب زیر را خواهید دید
my_dword_2
my_word_2 Byte_3 Byte_4
Print Bin(my_dword_2)
Print ”——————& mdash;—-”
آزمایش در ارتباط با کاراکتر خالی پایانی (Null terminator ) در متغییر string
Dim My_date(11) As Byte ’
Dim Day As String * ۲ At My_date(1) Overlay
Dim Null_terminator As Byte At My_date(1) + ۲ Overlay ’Null terminator
Dim Month As String * ۲ At My_date(1) + ۳ Overlay
Dim Null_terminator_2 As Byte At My_date(1) + ۵ Overlay ’Null terminator
Dim Year As String * ۴ At My_date(1) + ۶ Overlay
Dim Null_terminator_3 As Byte At My_date(1) + ۱۱ Overlay ’Null terminator
Day = ”۱۶″
Month = ”۱۱″
Year = ”۲۰۱۱″
Print ”Day= ” ; Day
Print ”Month= ” ; Month
Print ”Year= ” ; Year
وقتی ما این کاراکتر را بجای ۰ با “/” بار میکنیم فانکشن print ارسال ادامه میدهد تا به یک کاراکتر پایانی خالی (Null terminator) برسد
Null_terminator = ۴۷
’۴۷= ”/”
Print Day
در این مورد دستور print بجای اینکه مقدار “۱۶″ را ارسال کند مقدار”۱۶/۱۱″ را ارسال می کند به دلیل اینکه اولین کاراکتر پایانی خالی بعد از متغییر ماه “۱۱″ پیدا میکند
End
http://kitboard.com/%D9%85%D8%AB%D8%A7%D9%84-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-overlay-%D8%AF%D8%B1-%D8%A8%DB%8C%D8%B3%DA%A9%D8%A7%D9%85.html