内联汇编计算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;
}


运行结果图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值