c-添加16位变量的函数



我正在编写我的第一个模拟器(Intel 8086微处理器(。

我被卡住了,因为我必须编写一个将16位变量相加的函数。这是我想写的函数的原型:

uint16_t add(uint16_t reg, uint16_t operand);

例如,如果我们执行:

add(5, 3)

函数应该这样计算:

111
0000000000000101 (= 5)
+ 0000000000000011 (= 3)
----------------
1000 (= 8)

以及返回8。

要编写这个函数,我需要找到一种方法来访问两个变量的每一位,然后能够将它们添加在一起,并将它们放在第三个变量中。

这在C中可能吗?如果可能的话,有人能启发我吗?

非常感谢你的回答。

假设32位计算机,这是非常琐碎的:

#include <stdint.h>
#include <stdio.h>
_Bool carry;
uint16_t add (uint16_t reg, uint16_t operand)
{
carry = (reg + operand) & 0xFFFF0000u;
return reg + operand;
}
int main (void)
{
int sum = add(65535, 1);
printf("%d, CF:%dn", sum, (int)carry);
}

其中reg + operand将被提升为32位int,如果相加超过16位,则布尔标志将被设置为1。

您大致需要这样的东西:

#include <stdio.h>
#include <stdint.h>
int carry = 0;
uint16_t add(uint16_t reg, uint16_t operand)
{
uint32_t result = (unint32_t)reg + operand;
carry = 0;
if (result > 0xffff)
carry = 1;
return result &= 0xffff;
}

int main()
{
uint16_t r1, r2, r3;
r1 = 0x10;
r2 = 0x1000;
r3 = add(r1, r2);
printf("r3 = %04x, carry = %dn", r3, carry);
r1 = 0x11;
r2 = 0xffff;
r3 = add(r1, r2);
printf("r3 = %04x, carry = %dn", r3, carry);
}

根据您的需要进行调整。

如果你想得到第n位(第0位是最低有效位,第16位是最高有效位(,你可以做

uint8_t bit = (num >> n) & 1;

它将数字n位右移,所以你想要的位是最低有效位,然后它做一个位掩码,只得到那个位。

最新更新