📄 idigitaddsubmult.c
字号:
/* idigitaddsubmult.c - inline assembler code for MSVC++6.0 on Intel586 *//* TPf, Sep 1999 */#include <iint.h>#include <idigit.h>#if !defined(USE_C_DIGITADD)DigitType DigitAdd(sum, a, b, carry) DigitType *sum, a, b, carry; /* *sum=LOW-DIGIT(a+b+carry); return HIGH-DIGIT(a+b+carry); */{__asm {/* .text .align 4 .globl USCORE(DigitAdd)USCORE(DigitAdd): */ mov ebx, sum ; &sum -> ebx mov ecx, a ; a -> ecx mov edx, b ; b -> edx mov eax, carry ; carry -> eax shr eax,1 ; carry -> carry-bit adc ecx,edx ; a + b + carry-bit -> ecx (former a) rcl eax,1 ; high order bit -> carry mov DWORD PTR [ebx], ecx ; a + b + carry-bit -> *sum }}#endif#if !defined(USE_C_DIGITSUB)DigitType DigitSub(diff, a, b, carry) DigitType *diff, a, b, carry; /* *diff=RESULT; return CARRY; where RESULT, CARRY are defined by: 2^BitsPerDigit > CARRY*2^BitsPerDigit + a - b - carry == RESULT >= 0 */{__asm {/* .align 4 .globl USCORE(DigitSub)USCORE(DigitSub): */ mov ebx, diff mov edx, a mov ecx, b mov eax, carry shr eax,1 sbb edx,ecx rcl eax,1 mov DWORD PTR [ebx], edx }}#endif#if !defined(USE_C_DIGITMULT)DigitType DigitMult(prod, a, b) DigitType *prod, a, b; /* *prod=LOW-DIGIT(a*b); return HIGH-DIGIT(a*b); */{__asm { /* .align 4 .globl USCORE(DigitMult)USCORE(DigitMult): */ mov ebx, prod mov eax, a mov ecx, b mul ecx mov DWORD PTR [ebx], eax mov eax,edx }}#endif#if !defined(USE_C_DIGITMULTADD)DigitType DigitMultAdd(prod, a, b, carry) DigitType *prod, a, b, carry; /* *prod=LOW-DIGIT(a*b+carry); return HIGH-DIGIT(a*b+carry); */{__asm {/* .align 4 .globl USCORE(DigitMultAdd)USCORE(DigitMultAdd): */ mov ebx, prod mov eax, a mov edx, b mul edx mov ecx, carry add eax,ecx adc edx,0 mov eax, [ebx] mov eax,edx }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -