السلام عليكم
مساء الخير على الجميع
اليوم جبت لكم
موضوع عن
أنواع البيانات في الأسمبلي data types
السلام عليكم
مساء الخير على الجميع
اليوم جبت لكم
موضوع عن
أنواع البيانات في الأسمبلي data types
انواع البيانات الإفتراضية داخل الأسمبلي تعتمد على المعالج و الـ Assembler المستخدم
مدونتي: C++ Tips and Tricks
هل يمكن حفظ هذه القيمة:
FFFFFFFFh
في متغير من نوع DWORD؟
علما ان المعالج (intel) يستخدم نظام الTwo's Complement.
انا حسب فهمي لا, و لكن في msdn و غير المواقع مكتوب هذا التعريف لDWORD:
A DWORD is a 32-bit unsigned integer (range: 0 through 4294967295 decimal). Because a DWORD is unsigned, its first bit (Most Significant Bit (MSB)) is not reserved for signing..
طيب اذا الMSBit تم تجاهله(ممكن يكون 0 او 1) كيف المعالج حيفرّق بين الرقم السالب و الموجب؟؟
بعدين بهذا التعريف مكتوب unsigned بس يرجع يقول ممكن الMSB يكون 1, و لكن اذا كان 1 حيكون الرقم سالب عشان (في نظام الTwo's Complement) اذا كان الMSB يساوي 1 ---> اذا الرقم سالب.
لو في توضيح.
تم تعديل هذه المشاركة بواسطة adam-master في 27 مايو 2013 في 19:58
اقتباسهل يمكن حفظ هذه القيمة: FFFFFFFFh في متغير من نوع DWORD؟
نعم يمكن لأن هذه القيمه تستهلك مساحة 32بت و هي مساحة النوع DWORD.
إقراء الفصل الأول Data Representation من كتاب The Art of Assembly Language Dos Edition، إذا كان لا يوجد وقت لديك إقرء الجزئين 1.7 و 1.8.
ملاحظة: مسجلات المعالج ما هي إلا اماكن مؤقتة لتخزين للبيانات و قد تحتوى على اى شي، التعليمه هى التى تحدد طبيعة محتوى المسجل.
و الله ولي التوفيق
تم تعديل هذه المشاركة بواسطة C++er في 28 مايو 2013 في 00:17
مدونتي: C++ Tips and Tricks
شكرا C++er ردودك مفيدة
سوف اعود عندما احمل و اقرا الجزئين.. ان شاء الله توصل الفكرة!!
انا الظاهر فاهم غلط يعني الCPU فقط يقوم بجمع محتويات الريجيستر و يعطي النتيجة.. و ال(؟) يعلم اذا هذا الرقم Two's Complement ام لا.. و الله اعلم مين ال"؟"..
على كل لي عودة.
تعديل:
------
بعد قراءة ردك بتمعن اكثر.. استنتج ان ال"؟" هو الInstruction الموجود داخل الCPU.
تعديل:
------
اذا يجب ان تكون الدالة التي تقوم عرض محتوى على الشاشة عارفة اذا نظام الTwo's Complement مستخدم ام لا, لوضع رقم الاسكي التابع ل"-" على الشاشة.
^كلام صح ولا تخاريف :wacko:
تم تعديل هذه المشاركة بواسطة adam-master في 28 مايو 2013 في 12:22
يظهر أنه لديك لبس بين تمثيل العدد بالـsign magnitude و two's complement. المعالجات تستخدم التمثيل بالمتممة الثنائية two's complement، ولايختلف معها طريقة جمع المعالج للأعداد ذا الإشارة signed وبين الأعداد بدون الإشارة unsigned.
مثلاً في المتممة الثانية -1 يكافئ 0xffffffff في مسجل بطول 32 بت، عند جمع -1 مع 1 سيعطي 0، وكذلك عند جمع المعالج لـ0xffffffff مع 1 فستعطي 0 (ليس لأن العدد سالب بل لأن العدد ببساطة طفح وتجاوز حاجز الـ32بت عند جمعه).
من يحدد هل الرقم 0xffffffff هو -1 أم 4294967295؟ البرنامج:
#include <stdio.h>
int main(int argc, char **argv) {
unsigned int i = (unsigned int) -1; // max value 0xffffffff
printf("signed : %d\n", i); // -1
printf("unsigned : %u\n", i); // 4294967295
return 0;
}
بعض المعماريات مثل x86 تستخدم نفس التعليمة (add) لجمع الأعداد ذات الإشارة والأعداد الـunsigned، قد توفر بعض المعماريات الأخرى تعلميات خاصة للأعداد الـunsigned، السبب أنه في بعض تلك المعماريات يقوم المعالج بعمل استثناء exception عند حدوث مثل الطفح السابق، استخدامك للنسخة الـunsigned يطلب من المعالج أن يتجاهل الطفح (ولكن آلية الجمع هي نفسها).
وحش :D
تعديل:
------
يعني ببساطة دوال العرض على الشاشة هي المسؤولة عن التمييز. مثل:printf او الفانكشن ">>" التابع للكلاس cout.
تم تعديل هذه المشاركة بواسطة adam-master في 28 مايو 2013 في 15:42
اقتباسيعني ببساطة دوال العرض على الشاشة هي المسؤولة عن التمييز. مثل:printf او الفانكشن ">>" التابع للكلاس cout.
دوال العرض هي المسئولة عن إظهار الرقم بالصورة التي تريدها سواء بإشارة او بغيرها، مثلا:
#include <stdio.h>
int main()
{
int i = -1;
printf("-1 as signed: %i\n"
"-1 as unsigned: %u\n"
"-1 as hexadecimal: 0x%x\n", i, i, i);
return 0;
}النتيجة:
-1 as signed: -1 -1 as unsigned: 4294967295 -1 as hexadecimal: 0xffffffff
كما ترى الـ input format للدالة printf هو المسئول عن إخراج القيمة بالشكل الذى أريده.
مثال أخر بالأسمبلي:
mov eax, ffffffffh cmp eax, fffffff6h ;CF=0, ZF=0, OF=0, SF=0 ;unsigned compare ja ABOVE_VALUE ;CF=0 and ZF=0 jb BELOW_VALUE ;CF=1 ;signed compare jg GREATER_THAN_VALUE ;ZF=0 and SF=OF jl LESS_THAN_VALUE ;SF != OF
إذا كانت القيمة الموجوده داخل eax بدون إشارة unsigned حينها تحتاج لإستخدام ja و jb حيث انهم يقارنوا الأعداد بغير إشارة، إذا كانت القيمة بإشارة signed حينها تحتاج لإستخدام jg و jl لأنهم مصممين لمقارنة الأعداد بإشارة.
كما ترى البرنامج هو المسئول عن انتاج التعليمة المناسبة بناءا على نوع البيانات المستخدم و إذا كنت ستكتب كود الأسمبلي بشكل مباشر حينها تحتاج لأن تكون على دراية جيدة بتصنيف التعليمات instructions.
فى الكود السابق التعليمة cmp تقوم بطرح قيمة المعامل الثاني من الأول بإستخدام sub و يتم وضع الـ EFlags تبعا لعملية الطرح فى حالتنا هذه القيمة بعد الطرح ستكون 9 و بالتالي كافة الـ flags ألمستخدمة لتنفيذ عملية القفز بصفر و بناءا على التعليمة سيتم التحقق من الـ flag المناسب.
إذا اردت وضع الـ flags بقيم أخرى قم بتبديل القيمتين حينها ستكون الـ flags بالقيم التالية:
CF=1, ZF=0, OF=0, SF=1
و الله ولي التوفيق
تم تعديل هذه المشاركة بواسطة C++er في 28 مايو 2013 في 22:16
مدونتي: C++ Tips and Tricks
يفرح الانسان بس يفهم.
شكرا محمد على اهتمامك.