الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

small problem with strings

مغلق
بدأه allko في 25 أغسطس 2006 · 3 رد · 606 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد عمل برنامج console يكون كالتالي :

Please enter your name:ahmed

ahmed is the best

Enter to exit

كما ترون في البداية يطلب من المستخدم ان يدخل اسمه ثم نضيف جملة is the best الى اسم المستخدم

ثم نطبع جملة enter ro exit كي نضمن الا ينتهي البرنامج الا بعد الضغط على اي زر...

.386
.MODEL flat, stdcall
OPTION CASEMAP:NONE 

Include windows.inc
Include kernel32.inc
Include masm32.inc
IncludeLib kernel32.lib
IncludeLib masm32.lib

.data
one	  DB "Please enter your name :", 0
two	  DB "is da best",0   
CRLF	 DB 00Ah, 00Dh, 0
ExitMsg  DB "Enter to Exit", 0

.data?
buffer  DB ?

.code
Start:
invoke StdOut, addr one
invoke StdIn,  addr buffer, 15

xor ebx,ebx
comparison:
inc ebx
cmp buffer[ebx],NULL
jne comparison
mov buffer[ebx],20h

invoke StdOut, addr buffer
invoke StdOut, addr two	
invoke StdOut, addr CRLF
invoke StdOut, addr ExitMsg
invoke StdIn,  addr buffer, 1
invoke ExitProcess, 0		   
End Start

انا اعرف ان السترنج تنتهي بـ NULL لذالك اذا بحثنا عن الـ NULL واستبدلناها باي حرف اخر وليكن 20h اي زر المسافة

ثم قمنا بطباعة اليوزنيم يليه جملة is the best فالمفروض ان يطبع الجملتين متصلتين لانه لا يوجد ما يفصلهما

اي لا يوجد شيء يدل على ان allko هي سترنج منفصلة بحد ذاتها فقد قمت بازالة العلامة الدالة على نهايتها وهي ال null

رغم ذلك فان هذا الكود يطبع التالي :

Please enter your name:allko
allko
 is da best
enter to exit

لاحظ انه قبل كلمة is هناك مسافة

يبدوا ان تخزين اي سترنج لا يضيف الى نهايتها NULL فحسب ، بل أيضا CRLF .

حاولت بدل ان ابحث عن الـ NULL ، ان ابحث عن الـ CRLF واستبدلهما بمسافتين لكن فشلت المحاولة.

ما الحل؟

#2

وعليكم السلام ورحمة الله وبركاته,

الـ CR-LF هي 0D0Ah

xor	ebx, ebx
.while	buffer[ebx] != 0dh
	inc	ebx
.endw
mov	buffer[ebx], 20h
inc	ebx
mov	buffer[ebx], 00h
;xor ebx,ebx
;comparison:
;inc ebx
;cmp buffer[ebx],NULL
;jne comparison
;mov buffer[ebx],20h

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

اذن المشكلة كانت - وبكل بساطة - أن CRLF=0D0Ah وليس 0A0Dh

شكرا ;)

#4

نعم ولا, يجب ان تتحقق من اول حرف ايضا الا يكون انتر بدون اسم.

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

مواضيع مشابهة