内联汇编计算2个16进制的大数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main( void )
{               
	// 大数字
	// 20304050607080908070605040302010(Hex) + 60E0A0B0C080907060504030A0F0F0F0(Hex) = 8110e10120f11100e0c0a080e1211100(Hex)
	char nNum1[16] = { 0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20 };
	char nNum2[16] = { 0xF0,0xF0,0xF0,0xA0,0x30,0x40,0x50,0x60,0x70,0x90,0x80,0xC0,0xB0,0xA0,0xE0,0x60 };

	char *pNum1 = NULL;
	char *pNum2 = NULL;

	// 申请16字节空间
	pNum1 = ( char * )malloc( sizeof( char ) * 16 );
	pNum2 = ( char * )malloc( sizeof( char ) * 16 );
	
	_asm
	{
		/* 数据内存拷贝 */
		// 内存拷贝1
		cld				// 方向标志DF设置0
		lea esi,nNum1	// 源地址
		mov edi,pNum1	// 目的地址
		mov ecx,16		// 移动的数量
		rep movsb
		// 内存拷贝2
		cld				// 方向标志DF设置0
		lea esi,nNum2	// 源地址
		mov edi,pNum2	// 目的地址
		mov ecx,16		// 移动的数量
		rep movsb

		/* 加法计算 */
		xor ebx,ebx		// 索引
		mov esi,pNum1	// 内存区1
		mov edi,pNum2	// 内存区2
		mov ecx,16		// 循环次数
	s:	mov ah,byte ptr[edi]
		adc byte ptr[esi],ah
		inc esi
		inc edi
		loop s
	}

	printf( "下面是2个16进制的大数相加:\r\n" );
	printf( "20304050607080908070605040302010\r\n" );
	printf( "60E0A0B0C080907060504030A0F0F0F0 +\r\n" );
	printf( "------------------------------------\r\n" );
	for( int nIndex=15; nIndex>=0; nIndex-- )
	{
		printf( "%02X", ( unsigned char ) * (pNum1 + nIndex ) );
	}

	// 释放内存
	free( pNum1 );
	free( pNum2 );

	::Sleep( 100000 );

	return 0;
}


运行结果图:

内联汇编计算2个16进制的大数_第1张图片

你可能感兴趣的:(内联汇编计算2个16进制的大数)