أهمية السطر الجديد
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 41 من 45.
لقد كنت تضيف 0x0a (سطر جديد) في نهاية السلاسل النصية الخاصة بك. ولكن ماذا يحدث إذا نسيت ذلك؟
بدون سطر جديد:
يتم طباعة النص، لكن المؤشر يبقى في نفس السطر. أي مخرجات مستقبلية ستظهر بجانبه مباشرة.
مثال بدون سطر جديد:
section .data
first db 'Hello'
firstLen equ $ - first
second db 'World'
secondLen equ $ - second
section .text
mov rax, 1
mov rdi, 1
mov rsi, first
mov rdx, firstLen
syscall
mov rax, 1
mov rdi, 1
mov rsi, second
mov rdx, secondLen
syscallالمخرجات:
HelloWorld
لا توجد مسافة. لا يوجد سطر جديد. كل شيء ملتصق ببعضه البعض.
مع سطر جديد:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - secondالمخرجات:
Hello
World
تتم طباعة كل سلسلة نصية في سطر خاص بها.
ما يفعله السطر الجديد:
| الحرف | ASCII | التأثير |
|---|---|---|
0x0a | 10 | ينقل المؤشر إلى بداية السطر التالي |
أخطاء شائعة في السطر الجديد:
| الخطأ | النتيجة |
|---|---|
| عدم وجود سطر جديد على الإطلاق | النص يظهر متصلاً في سطر واحد |
| سطر جديد فقط في نهاية السلسلة النصية الأخيرة | السلاسل النصية السابقة تظهر متصلة، والأخيرة تنتقل إلى السطر التالي |
| سطر جديد في منتصف السلسلة النصية | فواصل الأسطر تظهر في أماكن غير متوقعة |
القاعدة الآمنة:
أضف دائماً 0x0a في نهاية كل سلسلة نصية تريدها في سطر خاص بها.
التحدي
يتم إعطاؤك ثلاث سلاسل نصية بدون أسطر جديدة. مهمتك هي طباعتها بحيث تظهر في ثلاثة أسطر منفصلة.
السلاسل النصية هي:
| السلسلة النصية | القيمة |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
المتطلبات:
- قم بتعريف كل سلسلة نصية مع سطر جديد (
0x0a) في نهايتها - احسب طول كل سلسلة نصية تلقائياً
- اطبع السلاسل الثلاث جميعاً باستخدام syscall الخاص بـ write
- قم بالخروج بشكل نظيف مع الكود 0
جرّب بنفسك
section .data
; مهام: تعريف word1 بـ 'Apple' وسطر جديد
; مهام: تعريف word2 بـ 'Banana' وسطر جديد
; مهام: تعريف word3 بـ 'Cherry' وسطر جديد
; مهام: حساب أطوال كل سلسلة نصية
section .text
global _start
_start:
; مهام: طباعة word1
; مهام: طباعة word2
; مهام: طباعة word3
; مهام: الخروج بشكل نظيفsection .data
word1 db 'Apple', 0x0a
word1Len equ $ - word1
word2 db 'Banana', 0x0a
word2Len equ $ - word2
word3 db 'Cherry', 0x0a
word3Len equ $ - word3
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, word1
mov rdx, word1Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word2
mov rdx, word2Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word3
mov rdx, word3Len
syscall
mov rax, 60
mov rdi, 0
syscallيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)3التعليمة الأولى - MOV
ما هي MOV؟MOV المباشرةMOV من سجل إلى سجلMOV من الذاكرة إلى السجلMOV من السجل إلى الذاكرةLEA - تحميل العنوانMOV بأحجام مختلفةتدريب: تبديل السجلاتملخص: تحدي MOV6نداء النظام Write
نداء النظام Write (1)واصف الملف (rdi)عنوان الـ Buffer (rsi)عدد البايتات (rdx)تجميع الأجزاء معاًطباعة سلسلتين نصيتينأهمية السطر الجديدمراجعة: إعداد Write