طباعة سلسلتين نصيتين
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 40 من 45.
أنت تعرف بالفعل كيفية طباعة سلسلة نصية واحدة. ولكن ماذا لو كنت تريد طباعة سلسلتين نصيتين منفصلتين؟ على سبيل المثال، "Hello " ثم "World!"؟
ببساطة، تقوم باستدعاء syscall الـ write مرتين — مرة واحدة لكل سلسلة نصية.
كيف يعمل:
; الطباعة الأولى
mov rax, 1
mov rdi, 1
mov rsi, firstMsg
mov rdx, firstLen
syscall
; الطباعة الثانية
mov rax, 1
mov rdi, 1
mov rsi, secondMsg
mov rdx, secondLen
syscallمثال:
section .data
first db 'Hello ', 0x0a
firstLen equ $-first
second db 'World!', 0x0a
secondLen equ $-second
section .text
global _start
_start:
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
mov rax, 60
mov rdi, 0
syscallالمخرجات:
Hello World!
لماذا نطبع سلسلتين نصيتين بدلاً من واحدة؟
| السبب | مثال |
|---|---|
| إعادة الاستخدام | طباعة نفس التحية بأسماء مختلفة |
| المرونة | طباعة رسائل مختلفة بناءً على الشروط |
| التنظيم | الحفاظ على الرسائل المختلفة منفصلة في الذاكرة |
يمكنك طباعة أي عدد تريده من السلاسل النصية:
فقط قم بتكرار استدعاء النظام write لكل سلسلة نصية.
التحدي
لقد تم إعطاؤك سلسلتين نصيتين: partOne بالقيمة 'Good' و partTwo بالقيمة 'bye'. كلتاهما تحتويان بالفعل على سطر جديد في النهاية.
اكتب الكود لطباعة partOne ثم partTwo بحيث يظهر المخرج كما يلي:
Good
bye
قسم البيانات (data section) ونداء النظام للخروج (exit syscall) مقدمان بالفعل. تحتاج فقط إلى كتابة ندائي النظام للطباعة (write syscalls).
جرّب بنفسك
section .data
partOne db 'Good', 0x0a
partOneLen equ $-partOne
partTwo db 'bye', 0x0a
partTwoLen equ $-partTwo
section .text
global _start
_start:
; TODO: طباعة partOne باستخدام نداء النظام write
; TODO: طباعة partTwo باستخدام نداء النظام write
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