الفصل 39: البرمجة منخفضة المستوى
مقدمة
لغة ص تدعم البرمجة منخفضة المستوى عبر التوجيهات الخاصة — مفيدة لبرمجة الأنظمة والتحكم بالعتاد.
التوجيهات (@)
@حجم — معرفة حجم النوع
sad
متغير حجم_رقم = @حجم(رقم) # 8 بايت
متغير حجم_عشري = @حجم(عشري) # 8 بايت
متغير حجم_منطقي = @حجم(منطقي) # 1 بايت
اطبع_سطر("حجم الرقم: " + حجم_رقم + " بايت")@ذري — عمليات ذرية
للبرمجة المتزامنة الآمنة:
sad
متغير عداد = 0
# قراءة ذرية
متغير قيمة = @ذري(تحميل، عداد)
# كتابة ذرية
@ذري(تخزين، عداد، 42)
# جمع ذري
@ذري(جمع، عداد، 1)@غير_آمن — كتل بدون فحوصات
sad
@غير_آمن
# كود بدون فحص حدود المصفوفة
# أو فحص الأنواع
نهايةتحذير
استخدم @غير_آمن فقط عند الضرورة القصوى، لأنه يلغي فحوصات الأمان.
@وقت_الترجمة — تنفيذ أثناء الترجمة
sad
@وقت_الترجمة
متغير حجم_الجدول = 1024
متغير إصدار = "2.0.0"
نهاية@متطاير — منع التحسين
sad
# للعتاد الذي يتغير خارج البرنامج
@متطاير متغير سجل_حالة = 0@تجميع — أسمبلي مضمن
sad
# للمترجم sadc فقط
@تجميع("nop")
@تجميع("cli") # تعطيل المقاطعاتالعمليات الثنائية
sad
متغير أ = 0b1010 # 10
متغير ب = 0b1100 # 12
اطبع_سطر("و: " + (أ & ب)) # 0b1000 = 8
اطبع_سطر("أو: " + (أ | ب)) # 0b1110 = 14
اطبع_سطر("حصري: " + (أ ^ ب)) # 0b0110 = 6تطبيق: قراءة سجلات العتاد
sad
# محاكاة قراءة سجل عتاد
دالة قراءة_بت(سجل، بت)
ارجع (سجل >> بت) & 1
نهاية
دالة كتابة_بت(سجل، بت، قيمة)
إذا (قيمة == 1)
ارجع سجل | (1 << بت)
وإلا
ارجع سجل & ~(1 << بت)
نهاية
نهاية
# اختبار
متغير سجل = 0b10110100
اطبع_سطر("البت 2: " + قراءة_بت(سجل، 2)) # 1
اطبع_سطر("البت 0: " + قراءة_بت(سجل، 0)) # 0تمرين
اكتب دالة تحول رقماً إلى تمثيله الثنائي كنص:
الحل
sad
دالة إلى_ثنائي(رقم)
إذا (رقم == 0)
ارجع "0"
نهاية
متغير نتيجة = ""
بينما (رقم > 0)
نتيجة = (رقم % 2) + نتيجة
رقم = رقم / 2
نهاية
ارجع نتيجة
نهاية
اطبع_سطر(إلى_ثنائي(42)) # "101010"