gpt4 book ai didi

c - c中的多重,多重模拟之间的区别

转载 作者:太空宇宙 更新时间:2023-11-04 02:07:34 24 4
gpt4 key购买 nike

我正在编写一个 c 程序并解码 mips 32 位指令并模拟它们的功能减去按位部分。我不知道我应该如何在这里区分有符号和无符号操作。

例如,给定寄存器 rd 和 rs,我需要相乘并将结果放入 rd。

对于mult指令,就这么简单:

reg[rd] = reg[rs] * reg[rt];

multu 指令应该是什么?我是否需要先对寄存器的内容进行按位运算?

我还需要做:

-添加,添加,-div, divu-sub, subu

它们在功能上的区别是否相同?

最佳答案

MIPS 乘法不能溢出。它是具有完整 64 位结果的 32x32 位操作。

签名和未签名的结果之间也存在显着差异。

要在 C 中轻松模拟这些,您需要来自 <stdint.h> 的 C99 整数类型:

uint32_t reg1, reg2; /* Use this type for the registers, normally */
uint32_t hi, lo; /* special MIPS registers for 64-bit products and dividends */
/* Signed mult instruction: */
int64_t temp = (int64_t)(int32_t)reg1 * (int_64_t)(int32_t)reg2;
hi = (uint32_t)((temp>>32) & 0xFFFFFFFF);
lo = (uint32_t)(temp & 0xFFFFFFFF);

已完成向有符号 32 位类型的中间转换,以便向有符号 64 位类型的转换在乘法之前进行符号扩展。无符号乘法类似,只是不需要中间转换:

/* Unsigned multu instruction: */
uint64_t tempu = (uint64_t)reg1 * (uint64_t)reg2;
hi = (uint32_t)((temp>>32) & 0xFFFFFFFF);
lo = (uint32_t)(temp & 0xFFFFFFFF);

关于c - c中的多重,多重模拟之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19073454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com