gcc - क्या कोई यह बता सकता है कि यह इनलाइन#define असेंबली क्या कर रही है?




assembly x86 (2)

GNU C इनलाइन असेंबली में इस कोड का शाब्दिक अनुवाद है:

static inline short ADC(short dst, short src)
{
     asm ("add %1, %0; adc $0, %0" : "+r"(dst) : "rmi"(src));

     return (dst);
}

लेकिन एनपीई द्वारा प्रदान किया गया संस्करण थोड़ा अधिक पोर्टेबल होना चाहिए।

मैं एक सामयिक सी प्रोग्रामर हूं। मैं एक टर्बो सी कार्यक्रम में इनलाइन इनलाइन असेंबली कोड के पार आया हूं

#define ADC(dst,src)    { asm MOV AX, dst;  asm ADD AX, src;  \
              asm ADC AX, 0;    asm MOV dst, AX; }

dst और src दोनों अहस्ताक्षरित 16-बिट पूर्णांक हैं।

यह जीएनयू सी ++ में संकलन नहीं करेगा। किसी को समझा सकता है कि यह क्या कर रहा है? TIA!


पहले दो निर्देश dst और src एक साथ जोड़ते हैं, परिणाम को संचायक में जमा करते हैं। तीसरा निर्देश गणना करता है कि कभी-कभी "एंड-अराउंड कैरी" कहा जाता है और चौथा परिणाम dst

निम्नलिखित एक समान सी कार्यान्वयन है:

int32_t sum = dst + (int32_t)src;
dst = (int16_t)((sum & 0xffff) + (sum >> 16));

विकिपीडिया अंत में अपने पूरक के कवरेज के बारे में बात करता है :

इस प्रणाली में दर्शाए गए दो नंबरों को जोड़ने के लिए, एक पारंपरिक बाइनरी जोड़ करता है, लेकिन उसके बाद एक अंत-अराउंड कैरी करना आवश्यक होता है: अर्थात, परिणामी राशि में किसी भी परिणामी कैरी को वापस जोड़ें।

एंड-अराउंड कैरी का उपयोग किया जाता है, उदाहरण के लिए, आईपीवी 4 चेकसम की गणना करते समय।





carryflag