在这里,我得到了一个我部分解决但完全不理解的考试题目
为什么在这里使用volatile
?和缺少的表达
我必须是switches >>8
。
谈到翻译时我有一些困难。
八个开关的内存映射到内存地址0xabab0020,其中 最低有效位(索引0)表示开关编号1和索引为7的位 表示开关编号8.位值1表示开关打开和 0表示它已关闭。写下缺少的C代码表达式,这样就可以了 如果切换开关编号8关闭,则循环退出。
volatile int * switches = (volatile int *) 0xabab0020;
volatile int * leds = (volatile int *) 0xabab0040;
while(/* MISSING C CODE EXPRESSION */){
*leds = (*switches >> 4) & 1;
}
将上面的完整C代码翻译成MIPS汇编代码,包括缺少的C代码表达式。您不能使用伪指令。
答案 0 :(得分:2)
没有volatile你的代码可以合法地被编译器解释为:
int * switches = (volatile int *) 0xabab0020;
int * leds = (volatile int *) 0xabab0040;
*leds = (*switches >> 4) & 1;
while(/* MISSING C CODE EXPRESSION */){
}
答案 1 :(得分:1)
switches
限定符表示leds
编译器可以通过系统中的其他代理更改地址volatile
和*switches
中的数据。如果没有while (*switches & 0x80 != 0)
限定符,编译器将被允许优化对这些变量的引用。
问题描述表明循环应在{{1}}的第7位设置时运行,即:{{1}}
翻译代码留给读者练习。
答案 2 :(得分:0)
volatile int * switches = (volatile int *) 0xabab0020;
volatile int * leds = (volatile int *) 0xabab0040;
while((*switches >> 8) & 1){
*leds = (*switches >> 4) & 1;
}
要mips
lui $s0,0xabab #load the upper half
ori $s0,0x0020
lui $s1,0xabab
ori $s1,0x0040
while:
lw $t0,0x20($s0)
srl $t0,$t0,8 #only the 8th bit is important
andi $t0,$t0,1 # clear other bit keep the LSB
beq $t0,$0, done
lw $t1,0x40($s1)
srl $t1,$t1,4
andi $t1,$t1,1
sw $t1,0x40($s1)
j while
done:
sw $t0,0x20($s0)