內聯彙編計算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;
}


運行結果圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章