您的位置:首页 > 其它

ADC指令+内联汇编计算2个16进制的大数

2013-11-06 13:31 288 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main(void)
{
// 128bit数字
// 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字节空间(128bit)
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;
}


ADC带进位的加法

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: