添加 16 位变量的函数
function that adds 16-bit variables
我正在编写我的第一个仿真器(Intel 8086 微处理器)。
我卡住了,因为我必须编写一个将 16 位变量加在一起的函数。这是我要编写的函数的原型:
uint16_t add(uint16_t reg, uint16_t operand);
例如,如果我们执行:
add(5, 3)
函数应该像这样计算:
111
0000000000000101 (= 5)
+ 0000000000000011 (= 3)
----------------
1000 (= 8)
和return 8.
为了编写这个函数,我需要找到一种方法来访问两个变量的每一位,然后将它们相加并将它们放在第三个变量中。
这在 C 中可行吗?如果可行,有人可以启发我吗?
非常感谢您的回答。
如果想得到第n位(第0位为最低位,第16位为最高位),可以
uint8_t bit = (num >> n) & 1;
它的作用是右移数字 n
位,因此您想要的位是最低有效位,然后它执行位掩码以仅获取该位。
你非常粗略地需要这样的东西:
#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 = %d\n", r3, carry);
r1 = 0x11;
r2 = 0xffff;
r3 = add(r1, r2);
printf("r3 = %04x, carry = %d\n", r3, carry);
}
根据您的需要进行调整。
假设是 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:%d\n", sum, (int)carry);
}
其中 reg + operand
将提升为 32 位 int
,如果加法超过 16 位,则布尔标志将设置为 1。
我正在编写我的第一个仿真器(Intel 8086 微处理器)。
我卡住了,因为我必须编写一个将 16 位变量加在一起的函数。这是我要编写的函数的原型:
uint16_t add(uint16_t reg, uint16_t operand);
例如,如果我们执行:
add(5, 3)
函数应该像这样计算:
111
0000000000000101 (= 5)
+ 0000000000000011 (= 3)
----------------
1000 (= 8)
和return 8.
为了编写这个函数,我需要找到一种方法来访问两个变量的每一位,然后将它们相加并将它们放在第三个变量中。
这在 C 中可行吗?如果可行,有人可以启发我吗?
非常感谢您的回答。
如果想得到第n位(第0位为最低位,第16位为最高位),可以
uint8_t bit = (num >> n) & 1;
它的作用是右移数字 n
位,因此您想要的位是最低有效位,然后它执行位掩码以仅获取该位。
你非常粗略地需要这样的东西:
#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 = %d\n", r3, carry);
r1 = 0x11;
r2 = 0xffff;
r3 = add(r1, r2);
printf("r3 = %04x, carry = %d\n", r3, carry);
}
根据您的需要进行调整。
假设是 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:%d\n", sum, (int)carry);
}
其中 reg + operand
将提升为 32 位 int
,如果加法超过 16 位,则布尔标志将设置为 1。