• 标 题:争分夺秒背单词 版本:V1.5.01.12.11注册机 (578字)
  • 作 者:zczc
  • 时 间:2001-12-18 20:02:20
  • 链 接:http://bbs.pediy.com

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"
void main()
{
  char name[80];
  char sn[80];
  int namelen,snlen,i=0;
  long febx=1;
  puts("\n用户名:");
  scanf("%s",name);
  namelen=strlen(name);
  puts("\n机器码:");
  scanf("%s",sn);
  snlen=strlen(sn);
  namelen=namelen+snlen;
  puts("\n注册码:");
  strcat(name,sn);
  for(i=0;i<namelen;i++)febx=(febx*0x22d6)+name[i];
  _asm{  mov eax, febx
        cdq
        xor eax, edx
        sub eax, edx
        mov febx,eax
    }
  printf("%d",febx);
  getch();
}

  • 标 题:没必要用汇编。一个简单的C函数搞定:) (569字)
  • 作 者:WenXinJY
  • 时 间:2001-12-19 9:24:17

_asm{  mov eax, febx
        cdq
        xor eax, edx
        sub eax, edx
        mov febx,eax
    }
分析:if febx >= 0 (最高位是0)
        cdq 后,edx==0. eax xor 0 == eax, eax-0==eax.
    elseif febx < 0 (最高位是1)
        cdq 后,edx==0xffffffff. (1)eax xor 0xffffffff == eax取反 == 0x100000000-eax-1. (2)sub eax,edx==sub eax,0xffffffff==sub eax,-1 == add eax,1.由(1)(2)得eax=(0x100000000-eax-1)+1=0x10000000-eax,在32位寄存器中即eax=-eax.
因此上述过程是将eax取绝对值。用abs(febx)[忘了是不是这样的了:)]可搞定。或者用一句:(febx>=0?febx:-febx)。