سؤال

(IA32) على سبيل المثال ،

test $eax, $eax

لماذا تريد أن تفعل ذلك من قبل؟ نعم هو كذلك $eax & $eax, ، حق؟ لا ينبغي هذا دائماً قم بتعيين سجل العلم ليقول إنهم متساوون ..؟

إضافة:لذلك سيقوم الاختبار بتعيين ZF (كما هو مذكور أدناه) إذا كان السجل صفرًا. فهل اختبار (كما هو مستخدم أعلاه) يستخدم بشكل أساسي فقط لمعرفة ما إذا كان السجل فارغًا؟ و ZF تم تعيينه إذا كان الأمر كذلك؟

هل كانت مفيدة؟

المحلول

سوف ضبط ZF (علامة الصفر) إذا كان السجل صفر. ربما يكون هذا هو الأكثر استخدامًا للاختبار. كما أنه سيضع أعلامًا أخرى بشكل مناسب ، ولكن من المحتمل أن يكون هناك فائدة أقل بكثير لهؤلاء.

أيضا ، يجب أن أذكر ذلك test لا يقوم حقًا بمقارنة - فهو يؤدي بيدويًا and العملية (رمي النتيجة ، باستثناء الأعلام).

لإجراء مقارنة بين المعاملات ، cmp سيتم استخدام التعليمات ، والتي تؤدي sub العملية ، رمي النتائج باستثناء الأعلام. أنت محق في أن أ

cmp $eax, $eax

لن يكون لها الكثير من نقطة ، حيث سيتم تعيين الأعلام وفقًا لنتيجة صفرية في كل مرة.

نصائح أخرى

هذا هو ضبط علامة الصفر ، بنفس الطريقة التي استخدامها or $eax,$eax يمكن أن يختبر غير تدمر لعلم الصفر كذلك.

يقوم بتعيين أعلام Z و S على المعالج ، حتى تتمكن من معرفة بعد "اختبار EAX ، EAX" (أو أي سجل آخر 8 ، 16 ، 32 وأعتقد أن 64 بت) إذا كانت القيمة صفرًا ، أو إذا كانت بت الإشارة تعيين ، باستخدام "JE/JNE/JZ/JNZ" أو "JS/JNS" على التوالي. خلال 30 عامًا من الترميز لبنية x80/x86 ، قمت بذلك عددًا كبيرًا من المرات ، مع معظم مجموعات التسجيل. (لا تستخدم هذا في الممارسة العملية على ESP!)

IIRC ، هناك جزء تماثل يتم حسابه أيضًا ، لذا عن طريق إجراء هذا الاختبار ، يمكنك معرفة ما إذا كان عدد البتات المحددة في السجل أكثر أو غريبة ، باستخدام "JP/JNP". لقد قمت مطلقا كان استخدام لهذا.

هذه التعليمات لا تهدف إلى التحقق من ما إذا كانت قيمة %eax هو الصفر. يمكن أن يكون ككل يستخدم للتحقق مما إذا كانت القيمة %eax هو الصفر أو إيجابية أو سلبية. أكبر ميزة لاستخدامها بهذه الطريقة هي أنها لا تعدل Vale من %eax (بعد الأداء %eax & %eax, ، إنه يتجاهل القيمة فقط) ويضع أعلام الحالة على النحو التالي.

إذا كانت قيمة ٪ eax صفر ، OF, CF, ZF = 0 (ضبط على الصفر)
آخر SF = MSB of the result (هنا ، النتيجة %eax & %eax). لذلك إذا كان الرقم سلبيًا ، نحصل على SF = 1, ، غير ذلك SF = 0.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top