طباعة سلسلتين نصيتين
جزء من قسم الأساسيات في رحلة 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!
لماذا نطبع سلسلتين نصيتين بدلًا من سلسلة واحدة؟
| السبب | المثال |
|---|---|
| إعادة الاستخدام | Print التحية نفسها مع أسماء مختلفة |
| المرونة | Print رسائل مختلفة بناءً على الشروط |
| التنظيم | احتفظ بالرسائل المختلفة منفصلة في الذاكرة |
يمكنك طباعة العدد الذي تريده من السلاسل النصية:
ما عليك سوى تكرار استدعاء النظام write لكل سلسلة نصية.
التحدي
لديك سلسلتان: partOne بقيمة 'Good' وpartTwo بقيمة 'bye'. كلتاهما تحتويان بالفعل على سطر جديد في النهاية.
اكتب التعليمات البرمجية لطباعة partOne ثم partTwo بحيث يُظهر الناتج:
Good
bye
قسم البيانات واستدعاء النظام للخروج مُقدَّمان بالفعل. ما عليك سوى كتابة استدعاءَي النظام للكتابة.
جرّب بنفسك
section .data
partOne db 'Good', 0x0a
partOneLen equ $-partOne
partTwo db 'bye', 0x0a
partTwoLen equ $-partTwo
section .text
global _start
_start:
; TODO: اطبع partOne باستخدام write syscall
; TODO: اطبع partTwo باستخدام write 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تدرّب بنفسك: Playground لـ Assembly