0
FPGA에서 MIPS 구현을 테스트하기 위해 몇 가지 어셈블러 테스트 코드를 작성했습니다. 컴파일을 위해 mips-linux-gnu를 사용하고 있습니다.divu MIPS 명령어에 대한 GNU AS의 Weired 동작
다음 코드는 divu 구현을 테스트하는 것이며, 코드에서 beq $ t2, $ t1, label1이 통과하고 $ 3에 3이로드됩니다.
.set noreorder
.text
__start:
li $t1, 10
li $t2, 2
divu $t1, $t2
mflo $t2
li $t1, 5
beq $t2, $t1, label1
j label2
label1:
li $t1, 3
label2:
nop
내 문제는 GNU-으로 실행의 다른 행동에 종료 위의 코드에 대한 이상한 출력을 생성하고, (3) $의 T1에로드되지 않습니다.
섹션의 diassembly
00000000 <__start>:
0: 2409000a addiu t1,zero,10
4: 240a0002 addiu t2,zero,2
8: 15400002 bnez t2,14 <__start+0x14>
c: 012a001b divu zero,t1,t2
10: 0007000d break 0x7
14: 00004812 mflo t1
18: 00005012 mflo t2
1c: 24090005 addiu t1,zero,5
20: 11490001 beq t2,t1,28 <label1>
24: 0800000b j 2c <label2>
00000028 <label1>:
28: 24090003 addiu t1,zero,3
0000002c <label2>:
2c: 00000000 sll zero,zero,0x0
는 .text 어떤 도움이 크게 감사합니다.
제 문제는 divu 명령에 대해 gcc가 생성 한 코드를 이해할 수 없다는 것입니다. RISC 파이프 라인에 대한 제 이해에서, 디바는 항상 처형 될 것입니다. 하지만 생성 된 코드가 t1에서 lo의 값을로드하는 이유는 무엇입니까 (mflo t1)? 나는 t1이 10을 가치로 생각해야한다는 것을 의미한다 ... –
@AliAbdallah 나는 여분의 mflo가 무엇을하고 있는지 알지 못한다. 컴파일러가 CPU 버그 (예 : 나눗셈에 더 많은 시간을 허용하기 위해 지연을 삽입)를 해결하기 위해이를 생성 할 수 있습니다. 귀하의 맥락 에서이 여분의 명령은 쓸모와 무해한, 적어도 현대 MIPS CPU에. 그러나 이것은 실제 문제, 즉 지점 지연 슬롯을 처리하는 방법과는 아무런 관련이 없습니다. –