6502 اسمبلی – مقدمه
Summarize this content to 400 words in Persian Lang
سلام، جهان!
من اخیراً شروع به بررسی برنامهنویسی زبان اسمبلی برای ریزپردازنده 6502 به عنوان بخشی از دوره آموزشی قابلیت حمل و بهینهسازی نرمافزار (SPO600) خود در سنکا کردهام.
در این پست، میخواهم یادداشتهای خود را در مورد جنبههای مختلف CPU 6502، از جمله آدرسدهی حافظه، طرحبندی، و دیگر مفاهیم کلیدی در برنامهنویسی اسمبلی به اشتراک بگذارم. امیدوارم یادداشتها برای دانشجویان SPO600 و علاقهمندان به مونتاژ آینده مفید باشد.
6502 چیست؟
6502 یک پردازنده 8 بیتی است که به این معنی است که می تواند 8 بیت (= 1 بایت) داده را در یک زمان مدیریت کند.
پرداختن به قابلیت ها
6502 دارای یک گذرگاه آدرس 16 بیتی است که به آن امکان آدرس 2 را می دهد16 (65536) مکان های حافظه منحصر به فرد، اعم از $0000 به $FFFF در نماد هگزادسیمال (اینجا و بعد، $ = هگز).
ساختار حافظه
حافظه را می توان به صورت 256 (2) سازماندهی کرد8) صفحات با 256 بایت (28) در هر صفحه
تفکیک آدرس: برای مدیریت و سازماندهی حافظه ساده، آدرس را به شماره صفحه 8 بیتی و افست 8 بیتی در صفحه تقسیم می کنیم.
مثال: تصور کنید که در حال تلاش برای یافتن خط خاصی در یک کتاب هستید. درک کدام توصیف از مکان آن آسان تر است: “این خطی است که با کلمه شماره 35403 شروع می شود” یا “این خط 10 در صفحه 123 است؟”. دومی ساده تر است.
این چه ربطی به ساختار 256 در 256 دارد؟
هر بیت برابر است با 1 یا 0 (2 حالت ممکن)، چون شماره صفحه یک مقدار 8 بیتی است، این به ما 2 می دهد.8 = 256 ترکیب منحصر به فرد از 1 و 0 برای شماره صفحه، و 256 (= 28) ترکیبات منحصر به فرد برای آدرس دادن به یک بایت خاص در داخل صفحه.
ذخیرهسازی آدرس و فرمت Little-Endian
هر مکان حافظه جداگانه می تواند 1 بایت داده را در خود جای دهد. از آنجایی که یک آدرس (یک اشاره گر در حافظه) با یک مقدار 16 بیتی (=2 بایت) نشان داده می شود، برای ذخیره شدن به دو مکان متوالی حافظه نیاز دارد.
6502 از قالب کم اندین استفاده می کند، به این معنی که مقادیر چند بایتی (مثلاً آدرس های 16 بیتی) با شروع بایت های کم اهمیت ذخیره می شوند. (می توانید در مورد آن بیشتر بخوانید اندیان اینجا: https://www.geeksforgeeks.org/little-and-big-endian-mystery/)
مثال:
lda #$00 ; set a pointer in memory location $40 to point to $0200
sta $40 ; store low byte ($00) in address $40
lda #$02
sta $41 ; store high byte ($02) in address $41
(اطلاعات مربوط به دستورالعمل ها را در کد اینجا می توانید پیدا کنید: https://www.pagetable.com/c64ref/6502/?tab=2)
اینجا آدرس 16 بیتی است $0200 در مکان های حافظه ذخیره می شود $40 و $41. از آنجایی که $00 سمت راست ترین (در مرتبه پایین) بایت است، ابتدا در ذخیره می شود $40. را $02، که سمت چپ ترین بایت (در مرتبه بالاتر) است، سپس در مکان متوالی حافظه ذخیره می شود. $41. پرانتز نشان می دهد که آدرس باید به عنوان یک اشاره گر در نظر گرفته شود، بنابراین 6502 به طور خودکار می داند که هر دو مکان را بر اساس نحو دستورالعمل نگاه کند.
نماد هگزادسیمال
نکته: به استفاده از نماد هگزادسیمال عادت کنید – این روش استاندارد برای نمایش مقادیر در برنامه نویسی سطح پایین است و برای درک آدرس های حافظه و عملیات در زبان اسمبلی ضروری است!
یک بایت می تواند از $00 به $FF در هگزادسیمال (یا 0 تا 255 در اعشار). به همین دلیل است که آدرسهای 16 بیتی، متشکل از 2 بایت، با 4 رقم هگزادسیمال نشان داده میشوند. علاوه بر این، هر مقدار ذخیره شده در یک مکان حافظه فردی را می توان با استفاده از 2 رقم هگزادسیمال نشان داد.
محل حافظه $0200 به صورت باینری = 0000 0010 0000 0000
کمی بیشتر در مورد چیدمان حافظه
در اینجا نحوه سازماندهی صفحات حافظه و آدرس ها آمده است:
شماره صفحه
محدوده آدرس حافظه (Hex)
بایت بالا
محدوده بایت کم
صفحه 0
0000 تا 00 دلار FF
00
00 دلار – FF دلار
صفحه 1
0100 دلار – 01 دلار FF
01
00 دلار – FF دلار
صفحه 2
0200 دلار – 02 FF
02
00 دلار – FF دلار
…
…
…
…
صفحه 254
FE00 دلار – FEFF دلار
FE
00 دلار – FF دلار
صفحه 255
FF00 دلار – FFFF دلار
FF
00 دلار – FF دلار
در حالی که بسیاری از صفحات دارای توابع از پیش تعریف شده هستند، من می خواهم صفحه صفر را برجسته کنم، همانطور که آن را در حالت های آدرس دهی هر دستورالعمل دیگر 6502 خواهید دید. (شما می توانید لیست کامل دستورالعمل های 6502 را در اینجا بیابید: https://www.pagetable.com/c64ref/6502/?tab=2)
صفحه صفر چیست؟
صفحه صفر به صفحه 0 از طرح حافظه (1-256 بایت) اشاره دارد. این صفحه برای ذخیره متغیرهایی که نیاز به دسترسی سریع دارند استفاده می شود (CPU 6502 دارای بهینه سازی های داخلی برای دسترسی Zero Page است).
حالت آدرس دهی صفحه صفر:
حالتهای آدرسدهی نحوه دسترسی به دادهها/استدلالهای یک دستورالعمل را مشخص میکنند.
هنگام استفاده از حالت آدرس دهی صفحه صفر، شما فقط یک بایت را در صفحه صفر مشخص می کنید، که اجازه می دهد کد و زمان اجرا کوتاه تر شود. (بیشتر را اینجا ببینید: https://www.pagetable.com/c64ref/6502/?tab=3#a8)
هنگام استفاده از حالت آدرس دهی صفحه صفر، بایت بالا است $00 فرض می شود.
سلام، جهان!
من اخیراً شروع به بررسی برنامهنویسی زبان اسمبلی برای ریزپردازنده 6502 به عنوان بخشی از دوره آموزشی قابلیت حمل و بهینهسازی نرمافزار (SPO600) خود در سنکا کردهام.
در این پست، میخواهم یادداشتهای خود را در مورد جنبههای مختلف CPU 6502، از جمله آدرسدهی حافظه، طرحبندی، و دیگر مفاهیم کلیدی در برنامهنویسی اسمبلی به اشتراک بگذارم. امیدوارم یادداشتها برای دانشجویان SPO600 و علاقهمندان به مونتاژ آینده مفید باشد.
6502 چیست؟
6502 یک پردازنده 8 بیتی است که به این معنی است که می تواند 8 بیت (= 1 بایت) داده را در یک زمان مدیریت کند.
پرداختن به قابلیت ها
6502 دارای یک گذرگاه آدرس 16 بیتی است که به آن امکان آدرس 2 را می دهد16 (65536) مکان های حافظه منحصر به فرد، اعم از $0000
به $FFFF
در نماد هگزادسیمال (اینجا و بعد، $ = هگز).
ساختار حافظه
حافظه را می توان به صورت 256 (2) سازماندهی کرد8) صفحات با 256 بایت (28) در هر صفحه
تفکیک آدرس: برای مدیریت و سازماندهی حافظه ساده، آدرس را به شماره صفحه 8 بیتی و افست 8 بیتی در صفحه تقسیم می کنیم.
مثال: تصور کنید که در حال تلاش برای یافتن خط خاصی در یک کتاب هستید. درک کدام توصیف از مکان آن آسان تر است: “این خطی است که با کلمه شماره 35403 شروع می شود” یا “این خط 10 در صفحه 123 است؟”. دومی ساده تر است.
این چه ربطی به ساختار 256 در 256 دارد؟
هر بیت برابر است با 1 یا 0 (2 حالت ممکن)، چون شماره صفحه یک مقدار 8 بیتی است، این به ما 2 می دهد.8 = 256 ترکیب منحصر به فرد از 1 و 0 برای شماره صفحه، و 256 (= 28) ترکیبات منحصر به فرد برای آدرس دادن به یک بایت خاص در داخل صفحه.
ذخیرهسازی آدرس و فرمت Little-Endian
هر مکان حافظه جداگانه می تواند 1 بایت داده را در خود جای دهد. از آنجایی که یک آدرس (یک اشاره گر در حافظه) با یک مقدار 16 بیتی (=2 بایت) نشان داده می شود، برای ذخیره شدن به دو مکان متوالی حافظه نیاز دارد.
6502 از قالب کم اندین استفاده می کند، به این معنی که مقادیر چند بایتی (مثلاً آدرس های 16 بیتی) با شروع بایت های کم اهمیت ذخیره می شوند. (می توانید در مورد آن بیشتر بخوانید اندیان اینجا: https://www.geeksforgeeks.org/little-and-big-endian-mystery/)
مثال:
lda #$00 ; set a pointer in memory location $40 to point to $0200 sta $40 ; store low byte ($00) in address $40 lda #$02 sta $41 ; store high byte ($02) in address $41
(اطلاعات مربوط به دستورالعمل ها را در کد اینجا می توانید پیدا کنید: https://www.pagetable.com/c64ref/6502/?tab=2)
اینجا آدرس 16 بیتی است
$0200
در مکان های حافظه ذخیره می شود$40
و$41
. از آنجایی که$00
سمت راست ترین (در مرتبه پایین) بایت است، ابتدا در ذخیره می شود$40
. را$02
، که سمت چپ ترین بایت (در مرتبه بالاتر) است، سپس در مکان متوالی حافظه ذخیره می شود.$41
. پرانتز نشان می دهد که آدرس باید به عنوان یک اشاره گر در نظر گرفته شود، بنابراین 6502 به طور خودکار می داند که هر دو مکان را بر اساس نحو دستورالعمل نگاه کند.
نماد هگزادسیمال
نکته: به استفاده از نماد هگزادسیمال عادت کنید – این روش استاندارد برای نمایش مقادیر در برنامه نویسی سطح پایین است و برای درک آدرس های حافظه و عملیات در زبان اسمبلی ضروری است!
یک بایت می تواند از $00
به $FF
در هگزادسیمال (یا 0 تا 255 در اعشار). به همین دلیل است که آدرسهای 16 بیتی، متشکل از 2 بایت، با 4 رقم هگزادسیمال نشان داده میشوند. علاوه بر این، هر مقدار ذخیره شده در یک مکان حافظه فردی را می توان با استفاده از 2 رقم هگزادسیمال نشان داد.
محل حافظه
$0200
به صورت باینری =0000
0010
0000
0000
کمی بیشتر در مورد چیدمان حافظه
در اینجا نحوه سازماندهی صفحات حافظه و آدرس ها آمده است:
شماره صفحه | محدوده آدرس حافظه (Hex) | بایت بالا | محدوده بایت کم |
---|---|---|---|
صفحه 0 | 0000 تا 00 دلار FF | 00 | 00 دلار – FF دلار |
صفحه 1 | 0100 دلار – 01 دلار FF | 01 | 00 دلار – FF دلار |
صفحه 2 | 0200 دلار – 02 FF | 02 | 00 دلار – FF دلار |
… | … | … | … |
صفحه 254 | FE00 دلار – FEFF دلار | FE | 00 دلار – FF دلار |
صفحه 255 | FF00 دلار – FFFF دلار | FF | 00 دلار – FF دلار |
در حالی که بسیاری از صفحات دارای توابع از پیش تعریف شده هستند، من می خواهم صفحه صفر را برجسته کنم، همانطور که آن را در حالت های آدرس دهی هر دستورالعمل دیگر 6502 خواهید دید. (شما می توانید لیست کامل دستورالعمل های 6502 را در اینجا بیابید: https://www.pagetable.com/c64ref/6502/?tab=2)
صفحه صفر چیست؟
صفحه صفر به صفحه 0 از طرح حافظه (1-256 بایت) اشاره دارد. این صفحه برای ذخیره متغیرهایی که نیاز به دسترسی سریع دارند استفاده می شود (CPU 6502 دارای بهینه سازی های داخلی برای دسترسی Zero Page است).
حالت آدرس دهی صفحه صفر:
حالتهای آدرسدهی نحوه دسترسی به دادهها/استدلالهای یک دستورالعمل را مشخص میکنند.
هنگام استفاده از حالت آدرس دهی صفحه صفر، شما فقط یک بایت را در صفحه صفر مشخص می کنید، که اجازه می دهد کد و زمان اجرا کوتاه تر شود. (بیشتر را اینجا ببینید: https://www.pagetable.com/c64ref/6502/?tab=3#a8)
هنگام استفاده از حالت آدرس دهی صفحه صفر، بایت بالا است
$00
فرض می شود.