我目前正在为一个要求我将 C 程序转换为 MIPS 程序集的类编写程序。前提是取两个十六进制值,看看有多少个 1 在二进制中匹配。例如,这是 C 代码:
// Count the number of items that match the pattern (have '1' bits in
// the same place as the pattern)
// pu32_a points to the first element of the array
// u32_n is the number of elements in the array
// u32_pat is the pattern to match
uint32_t pmatch(uint32_t* pu32_a, uint32_t u32_n, uint32_t u32_pat) {
uint32_t u32_result;
u32_result = 0;
while(u32_n != 0) {
if((*pu32_a & u32_pat) == u32_pat) u32_result++;
pu32_a++;
u32_n--;
}
return u32_result;
}
uint32_t au32_k[] = {0x80000000, 0xFFFFFFFF, 0x0000A5AA, 0xF0F0F0F0};
uint32_t u32_count;
main() {
u32_count = pmatch(au32_k, 4, 0x0000000F0);
printf("Number of matches is: %d \n", u32_count);
}
这是我当前的汇编代码:
#
#
# au32_k = {0x80000000, 0xFFFFFFFF,
# 0x0000A5AA, 0xF0F0F0F0}
#
#
.data
au32_k: .space 16
u32_n: .word 4
u32_pat: .word 240
.text
main:
# Store values in $s# registers
addi $s0, $zero, 2147483648
addi $s1, $zero, 4294967295
addi $s2, $zero, 42410
addi $s3, $zero, 4042322160
# Index = $t0
# This loads each of the values into an array
# starting at index $t0.
addi $t0, $zero, 0
sw $s0, au32_k($t0)
addi $t0, $t0, 4
sw $s1, au32_k($t0)
addi $t0, $t0, 4
sw $s2, au32_k($t0)
addi $t0, $t0, 4
sw $s3, au32_k($t0)
# Reset pointer to 0
addi $t0, $t0, -12
# Storing values in argument registers for subroutine
la $a0, au32_k
lw $a1, u32_n
lw $a2, u32_pat
jal pmatch
# This is where I get completely lost.
pmatch:
addi $s0, $zero, 0
addi $s1, $zero, 0
while:
beqz $a1, while_end
if_start:
while_end:
我完全迷失在 C 代码的这一部分:
if((*pu32_a & u32_pat) == u32_pat) u32_result++;
我不知道如何将其转换为汇编,坦率地说,我不知道这如何计算两个数字中匹配 1 位的数量。
我不会为您完成整个作业,但代码的作用如下。
if((*pu32_a & u32_pat) == u32_pat) u32_result++;
第一个重要的 block 是:
(*pu32_a & u32_pat)
它涉及取消引用名为 pu32_a
的指针变量。然后将其与另一个名为 u32_pat
的变量进行“与”运算。下一个 block 如下。
== u32_pat) u32_result++;
此 block 将 AND 运算的结果与名为 u32_pat
的变量进行比较。如果它等于名为 u32_result
的变量加一。
我是一名优秀的程序员,十分优秀!