سؤال

أحاول أن ألتف رأسي حول الفائض وأحمل الأعلام في x86.

كما أفهمها، لإضافة الأرقام التكميلية للرقم 2، لا يمكن إنشاء الأعلام إلا بإحدى الطرق الأربع (الأمثلة الخاصة بي هي أرقام مكونة من 4 بتات):

  1. نقاط البيع + نقاط البيع = سلبي (تجاوز)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. نقاط البيع + سلبي = نقاط البيع (تحمل)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. نيج + نيج = نيج (تحمل)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. Neg+neg = pos (التجاوز والحمل)
    • 1000 + 1001 = 0001 (-8 + -7 = 1)

لذا، في التجميع x86، هل يؤدي طرح B من A إلى توليد نفس العلامات مثل إضافة A و-B؟

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

المحلول

إليك جدول مرجعي قد يساعده.يوضح هذا مثالا على كل مزيج ممكن من الأعلام الحسابية الأربعة التي يمكن أن تنجم عن التعليمات الإضافية والتعليمات الفرعية على X86."H" "UD" و "D" الوقوف لمدة عرافة، والتعميز العشري غير الموقعة وتوقيعها عشرية لكل قيمة.على سبيل المثال، يقول الصف الأول ل SUB: 0xfe= 0x1 مع عدم وجود مجموعة أعلام.

ولكن، أعتقد أن القصة القصيرة هي أن إجابة أليكس صحيحة. giveacodicetagpre.

نصائح أخرى

جميع المجموعات الأربع لقيم الحمل والتجاوز ممكنة عند الإضافة أو الطرح.يمكنك رؤية المزيد من الأمثلة في هذه الإجابة.

هذه الإجابة وفيه دليل على أن الحمل الذي تحصل منه A-B هو عكس الحمل الذي تحصل عليه منه A+(-B).الكود الموجود بالرابط الأول يستغل هذه الخاصية للتحويل ADC داخل SBB.

ومع ذلك، يجب أن تكون قيمة علامة تجاوز السعة الموقعة هي نفسها لكليهما A-B و A+(-B) لأن ذلك يعتمد على ما إذا كانت النتيجة تحتوي على بت الإشارة الصحيح أم لا وفي كلتا الحالتين ستكون بت الإشارة هي نفسها.

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