2016-09-15 3 views
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 어떤 도움이 크게 감사합니다.

답변

1

지연 슬롯에서 분기 및 점프가 발생하지 않을 수 있습니다. beq의 지연 슬롯에 j이 있습니다. 또한, 나는 addiu t1, zero, 3j의 지연 슬롯 중 하나에서 원하지 않는다고 생각합니다. .set noreorder 대신 .set reorder을 사용해야합니다. 또는 지점 지연 슬롯을 처리하는 방법을 알아야합니다.

+0

제 문제는 divu 명령에 대해 gcc가 생성 한 코드를 이해할 수 없다는 것입니다. RISC 파이프 라인에 대한 제 이해에서, 디바는 항상 처형 될 것입니다. 하지만 생성 된 코드가 t1에서 lo의 값을로드하는 이유는 무엇입니까 (mflo t1)? 나는 t1이 10을 가치로 생각해야한다는 것을 의미한다 ... –

+0

@AliAbdallah 나는 여분의 mflo가 무엇을하고 있는지 알지 못한다. 컴파일러가 CPU 버그 (예 : 나눗셈에 더 많은 시간을 허용하기 위해 지연을 삽입)를 해결하기 위해이를 생성 할 수 있습니다. 귀하의 맥락 에서이 여분의 명령은 쓸모와 무해한, 적어도 현대 MIPS CPU에. 그러나 이것은 실제 문제, 즉 지점 지연 슬롯을 처리하는 방법과는 아무런 관련이 없습니다. –