我正在尝试熟悉汇编程序中的编程。一开始我选择了随机代码并尝试更新它。我还读了一些关于循环展开的事情,但我真的不知道从哪里开始。
这是我已修改过的代码:
0000: 4401000C | | ADDI R0, 0x000C, R1
0004: 00000000 | | NOP
0008: 00000000 | | NOP
000C: 0C220000 | loop | LDW R2, 0x0000(R1)
0010: 00000000 | | NOP
0014: 00000000 | | NOP
0018: 1C411000 | | ADD R2, R1, R2
001C: 00000000 | | NOP
0020: 00000000 | | NOP
0024: 4C420004 | | MULI R2, 0x0004, R2
0028: 00000000 | | NOP
002C: 00000000 | | NOP
0030: 18220040 | | STW R2, 0x0040(R1)
0034: 48210008 | | SUBI R1, 0x0008, R1
0038: 00000000 | | NOP
003C: 00000000 | | NOP
0040: 0C230004 | | LDW R3, 0x0004(R1)
0044: 00000000 | | NOP
0048: 00000000 | | NOP
004C: 18230044 | | STW R3, 0x0044(R1)
0050: 7C01FFB8 | | BRGE R1, loop
0054: 00000000 | | NOP
0058: 00000000 | | NOP
005C: 7000FFFC | halt | BRZ R0, halt
0060: 00000000 | | NOP
0064: 00000000 | | NOP
答案 0 :(得分:0)
如果已知代码是短循环,则循环展开会将代码写入。这是为了节省循环开销,特别是流水线处理器,分支需要很长时间(刷新和重新填充管道)。
基本上:而不是
for (i=0; i<3; i++)
{
a[i] = 0;
}
你做的很简单:
a[0] = 0;
a[1] = 0;
a[2] = 0;
我不认为你通过展开循环获得任何东西。
答案 1 :(得分:0)
我读了一些关于循环展开的内容,我想我明白了。您如何看待代码?
0000: 4401000C | | ADDI R0, 0x000C, R1
0004: 00000000 | | NOP
0008: 00000000 | | NOP
000C: 0C220000 | loop | LDW R2, 0x0000(R1)
0010: 0C24FFF8 | | LDW R4, 0xFFF8(R1)
0014: 0C23FFFC | | LDW R3, 0xFFFC(R1)
0018: 0C25FFF4 | | LDW R5, 0xFFF4(R1)
001C: 1C822000 | | ADD R4, R2, R4
0020: 1C411000 | | ADD R2, R1, R2
0024: 48210008 | | SUBI R1, 0x0008, R1
0028: 48260008 | | SUBI R1, 0x0008, R6
002C: 4C420004 | | MULI R2, 0x0004, R2
0030: 4C840004 | | MULI R4, 0x0004, R4
0034: 18230044 | | STW R3, 0x0044(R1)
0038: 18C50044 | | STW R5, 0x0044(R6)
003C: 18220048 | | STW R2, 0x0048(R1)
0040: 18C40048 | | STW R4, 0x0048(R6)
0044: 00000000 | | NOP
0048: 00000000 | | NOP
004C: 7000FFFC | halt | BRZ R0, halt