- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将此C++函数转换为MIPS程序集:
int set(int a[], int n, int v)
{
int i;
i = 0;
do {
a[i++] = v;
} while ( i < n);
return i;
}
$a0
中,n在
$a1
中,v在
$a2
中。
jal set
,应该调用
set
函数,我很确定我的错误与此有关。我也不知道我是否成功转换了函数。这是我的尝试:
.text
set:
li $t0, 0
addi $t0, $t0, 0
sll $t1, $t0, 2
add $t1, $t1, $a0
L1: lw $t1, 4($t1)
sw $a2, 0($t1)
blt $t0, $a1, L1
`.text
.globl set
set: addi $t0, $t0, 0 #i = 0;
sll $t1, $t0, 2 #offsets 4 * i
add $t1, $t1, $a0 #pointer to a[i]
L1: lw $t1, 4($t1) #a[i++]
sw $a2, 0($t1) #a[i++] = v
blt $t0, $a1, L1 #continue the loop as long as i < n`
.globl
中?
.text
的目的是什么?
最佳答案
好的,有一些问题。
更正的代码在底部。实际上,有两种方法可以做到这一点,具体取决于从C代码进行转换的字面意义。您的概念性问题的一部分可能是您试图将两种方法的部分结合起来。
您基于注释反馈(作为重复)(例如li
然后addi
)将原始代码中的前两个指令折叠为一个。但是,如果仅使用一个,则li
是正确的,因为addi
将寄存器添加到自身中,但是您不能依赖于初始值为零。sll
正在移动其中值为零的寄存器,因此inst没有执行任何操作。
要使用t1
加载a0
,您可以使用add $t1,$a0,0
[或add $t1,$a0,$zero
]lw
没有任何作用[C代码不会加载a
,所以为什么要使用asm?]。
但是,由于循环仍然无法正常工作,我对此进行了一些调整。
您的blt
之后没有返回任何内容,因此即使循环起作用,它也会“掉在世界的边缘”。每个调用的asm例程[类似于jal set
调用的例程]必须具有显式的return语句,即jr $ra
注意:在MIPS asm中,被调用方可以修改a*
[参数寄存器],因此请在a0
而不是t1
上循环(即,调用方希望将其丢弃)
无论如何,这是更正后的代码[请原谅免费的样式清理]:
.text
.globl set
set:
li $t0,0 # i = 0
L1:
sw $a2,0($a0) # a[i] = v
add $a0,$a0,4 # advance pointer
add $t0,$t0,1 # ++i
blt $t0,$a1,L1 # continue the loop as long as i < n
jr $ra # return
int
set(int *a, int n, int v)
{
int *end;
end = a + n;
for (; a < end; ++a)
*a = v;
return n;
}
.text
.globl set
set:
sll $a1,$a1,2 # convert int count to byte length
add $a1,$a0,$a1 # end = a + length
L1:
sw $a2,0($a0) # *a = v
add $a0,$a0,4 # ++a
blt $a0,$a1,L1 # continue the loop as long as a < end
jr $ra # return
i
的[概念]。但是,它还有一条额外的指令,第二条指令则没有。
x86
asm那样具有强大的索引寻址模式)。
main
函数:
.data
arr: .space 400 # allocate more space than count
.text
.globl main
main:
la $a0,arr # get array pointer
li $a1,10 # get count
li $a2,3257 # value to store
jal set
li $v0,1 # exit syscall number
syscall
If in the loop
a[i++] = v
, would I place theadd $t0, $t0, 1
line before thesw $a2, 0($a0)
?
a[++i] = v
,则可以这样做。也许,最好的方法是首先简化C代码。
a[i++] = v
实际上是:
a[i] = v;
i += 1;
a[++i] = v
实际上是:
i += 1;
a[i] = v;
When would I use the
sll
? I was reading examples and I noticed people usually dosll $t1, $t0, 2
when they're going to use a counter to go through an array.
sll
。而且,即使给出原始的C代码,这也是我编写循环代码的方式。
Would I use the
lw
if the C code said something likeint x = a[0]
?
if
:
if (x >= y) goto label
。甚至
if (x < y) j = 10
都超出限制。
x = y
,
x += y
或
x = y + z
。因此,
a = b + c + d
太复杂了。
int
数组递增,必须添加
4
。
int
指针之间的实际区别仅在您执行加载/存储操作时才重要:
lw/sw
表示
int
,
lb/sb
表示字节。
// RETURNS: number of elements changed
int
set(void)
// a0 -- "a" (pointer to int array)
// a1 -- "n" (number of elements in "a")
// a2 -- "v" (value to set into "a")
{
v0 = a1; // set return value
a1 <<= 2; // convert int count to byte length
a1 += a0; // point to one past end of array
L1:
*(int *)a0 = a2; // store v at current array location
a0 += 4; // point to next array element
if (a0 < a1) goto L1; // loop back until done
return;
}
In your first implementation, is
add $a0, $a0, 4
the equivalent to usingsll
in the second implementation?
i
对其进行索引]时,编译器将生成一个增量/添加指令,该指令会添加该指针定义为的
sizeof
类型。
int *iptr
,指定
iptr += 1
将生成
add $a0,$a0,4
,因为
sizeof(int)
为4。如果我们有
double *dptr
,
dptr += 1
,则编译器将生成
add $a0,$a0,8
,因为
sizeof(double)
为8
count
。现在,我们想知道数组将占用多少字节。我们将其称为
len
。这是确定各种类型的C代码:
char *arr;
len = count * sizeof(char);
len = count * 1;
len = count << 0;
// sll $a1,$a1,0
short *arr;
len = count * sizeof(short);
len = count * 2;
len = count << 1;
// sll $a1,$a1,1
int *arr;
len = count * sizeof(int);
len = count * 4;
len = count << 2;
// sll $a1,$a1,2
double *arr;
len = count * sizeof(double);
len = count * 8;
len = count << 3;
// sll $a1,$a1,3
From what I understand, using sll sets i as a counter for ints so it increments i and also iterates the array
sll
仅仅是MIPS的“左移逻辑”指令,当您需要使用C的
<<
运算符时,就可以使用它。
sll
来实现该效果。
int
数组,我们将索引增加1,但还必须将数组指针增加4。这就是我的第一个asm示例。终止条件为
index >= count
。
ssl
)并添加了数组地址来消除了单独的索引变量。现在
$a1
的地址为数组的最后一个元素+ 1,终止条件为
current_address >= last_element_plus_1
。请注意,current_address(
$a0
)仍必须增加4(
add $a0,$a0,4
)
关于c++ - 将C++函数转换为MIPS汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35399176/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!