From: George G. <tm...@in...> - 2001-06-22 19:31:33
|
I'm having problems with asms in Win 98. The following code works on Linux. It compiles using mingw, but the program hangs when the code is executed. I'm assuming that W98 has some restriction in the use of registers that I don't know about. Either that, or using std may be the problem. Does anyone know what the rules are for inline asm on W98? Or have a reference that I can read from the web? struct BCD { unsigned char Digits[24]; }; inline void BCD::Just_add(const BCD &value) { int clobber_esi, clobber_edi, clobber_ecx; asm volatile ( "std /* set directions flag to auto decrement */\n\t" "clc /* clear carry */\n\t" "1: lodsb /* load byte[esi] to al and decrement esi */\n\t" "adcb (%%edi),%%al /* add with carry */\n\t" "daa /* packed decimal adjust addition */\n\t" "stosb /* store byte al to [edi] decrement edi */\n\t" "loop 1b /* repeat ecx times */" : "=S" (clobber_esi), "=D" (clobber_edi), "=c" (clobber_ecx) : "0" (value.Digits + sizeof(value.Digits) - 1), "1" (Digits + sizeof(Digits) - 1), "2" (sizeof(Digits) - 1) : "cc", "ax", "memory" ); Check_if_zero(); } inline void BCD::Just_subtract(const BCD &value) { int clobber_esi, clobber_edi, clobber_ecx; asm volatile ( "std /* set directions flag to auto decrement */\n\t" "clc /* clear carry */\n\t" "1: movb (%%edi),%%al /* load byte[edi] to al */\n\t" "sbbb (%%esi),%%al /* subtract with borrow */\n\t" "das /* packed decimal adjust subtraction */\n\t" "stosb /* store byte al to [edi] decrement edi */\n\t" "decl %%esi /* count down */\n\t" "loop 1b /* repeat ecx times */" : "=S" (clobber_esi), "=D" (clobber_edi), "=c" (clobber_ecx) : "0" (value.Digits + sizeof(value.Digits) - 1), "1" (Digits + sizeof(Digits) - 1), "2" (sizeof(Digits) - 1) : "cc", "ax", "memory" ); Check_if_zero(); } |