我还有另一个家庭作业问题,就像我在这个网站上问的最后一个问题一样,老师和教科书都没有很好地解释。下面是问题:
将此C语句转换为MIPS汇编指令:
B[8] = A[i-j];
假设变量f、g、h、i和j分别分配给寄存器$s0、$s1、$s2、$s3和$s4。假设数组A和B的基地址分别位于寄存器$s6和$s7中。
现在,我遇到的问题是将两个变量相加,并将结果用作偏移量。到目前为止,我有以下几点:
sub $t0, $s3, $s4 # add values to get offset amount, store in $t0
sll $t1, $t0,2 # multiply the offset by 4, store in $t1
现在,我不知道是否可以使用$t1
作为偏移量来访问该数组元素。看起来教科书只使用数字(例如4($s7)
)而不使用寄存器(例如$t1($s7)
),我下一步该怎么办?
发布于 2014-02-19 22:16:22
编译器只能翻译完整的程序,所以这里有一个完整的程序,其中包括你的指令,并将其翻译成MIPS指令。我希望你能研究一下这里正在做的事情,并得出一些结论。
int main() {
int i = 3;
int j = 2;
int B[3] = {10, 20, 30};
int A[3] = {100, 200, 300};
B[8] = A[i-j];
}
以上操作的MIPS:
.file 1 "Cprogram.c"
# -G value = 8, Cpu = 3000, ISA = 1
# GNU C version cygnus-2.7.2-970404 (mips-mips-ecoff) compiled by GNU C version cygnus-2.7.2-970404.
# options passed: -msoft-float
# options enabled: -fpeephole -ffunction-cse -fkeep-static-consts
# -fpcc-struct-return -fcommon -fverbose-asm -fgnu-linker -msoft-float
# -meb -mcpu=3000
gcc2_compiled.:
__gnu_compiled_c:
.rdata
.align 2
$LC0:
.word 10
.word 20
.word 30
.align 2
$LC1:
.word 100
.word 200
.word 300
.text
.align 2
.globl main
.ent main
main:
.frame $fp,64,$31 # vars= 40, regs= 2/0, args= 16, extra= 0
.mask 0xc0000000,-4
.fmask 0x00000000,0
subu $sp,$sp,64
sw $31,60($sp)
sw $fp,56($sp)
move $fp,$sp
jal __main
li $2,3 # 0x00000003
sw $2,16($fp)
li $2,2 # 0x00000002
sw $2,20($fp)
addu $2,$fp,24
la $3,$LC0
lw $4,0($3)
lw $5,4($3)
lw $6,8($3)
sw $4,0($2)
sw $5,4($2)
sw $6,8($2)
addu $2,$fp,40
la $3,$LC1
lw $4,0($3)
lw $5,4($3)
lw $6,8($3)
sw $4,0($2)
sw $5,4($2)
sw $6,8($2)
lw $2,16($fp)
lw $3,20($fp)
subu $2,$2,$3
move $3,$2
sll $2,$3,2
addu $3,$fp,16
addu $2,$2,$3
addu $3,$2,24
lw $2,0($3)
sw $2,56($fp)
$L1:
move $sp,$fp # sp not trusted here
lw $31,60($sp)
lw $fp,56($sp)
addu $sp,$sp,64
j $31
.end main
https://stackoverflow.com/questions/21692159
复制相似问题