Skip to content

الفصل 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"

مُرخَّص بموجب رخصة MIT