اختبار إذا كان السجل يساوي نفسه في IA32
-
25-09-2019 - |
سؤال
(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
.