2012-03-01 1 views
0

바닐라 커널 2.6.35에서 arch/mips/lib/csum_partial.S에있는 csum_partial() 함수 코드를 이해하려고합니다. 입력 길이가 8 바이트보다 작은 경우 버그가있는 것 같습니다. 내가 입력 길이가 인 경우에MIPS csum_partial

/* 
* a0: source address 
* a1: length of the area to checksum 
* a2: partial checksum 
*/ 

#define src a0 

#define sum v0 

    .text 
    .set noreorder 
    .align 5 
LEAF(csum_partial) 
    move sum, zero 
    move t7, zero 

    sltiu t8, a1, 0x8 
    bnez t8, .Lsmall_csumcpy  /* < 8 bytes to copy */ 
    move t2, a1 

다음 여기에 기능이 시작 부탁 해요 이유는 그것이 합리적인 소리를하지 않는 것을 알고, 그건 미만 (8) 우리는 small_csumcpy에 뛰어 도달하지 명령을 이동하라, 맞지?. 그리고 거기에 우리가 가지고있다 :

.Lsmall_csumcpy: 

    move a1, t2 
    ... 

내 질문은 어디 t2 레지스터가 초기화됩니다! 미리 감사드립니다. 다음 코드

답변

1

move 정도로 t2.Lsmall_csumcpy:의 정확한 값을 갖고, 분기가 실행되기 전에 t2 레지스터 할당 도착 Branch Delay Slot

bnez t8, .Lsmall_csumcpy  /* < 8 bytes to copy */ 
move t2, a1 

이다. move 명령어는 코드에서 들여 쓰기되어 판독기가 지연 슬롯에 있음을 나타냅니다.

어셈블러는 일반적으로 NOP의와 지연 슬롯을 채우고,하지만 인해 .set noreorder 지시자, 어셈블러가 작성되는 정확한 순서에서이 코드의 지침을 조립. 교실에서 사용되는 일부 MIPS 시뮬레이터가 할

기본적으로 분기 지연 슬롯을 활성화하지 않으므로 지연 슬롯이 활성화되어 있지 않으면이 코드에서이 코드가 올바르게 작동하지 않을 수 있습니다.

+0

참고 : QtSpim/Spim/Mars와 같은 대부분의 시뮬레이터에는 분기 옵션이 지연되어 있지만 대개 비활성화됩니다. 설정/옵션 대화 상자에서 수동으로 활성화해야합니다. – Wiz

+0

감사! 내 대답을 편집했습니다. – markgz

+0

와우, 정말 고마워! 나는 들여 쓰기와 일반적인 논리로 인해 분기 후에 명령이 어떻게 든 실행되고 있다고 생각했지만, 내가 물어 본 모든 사람들은 이것이 일어날 수 없다고 나에게 말했다. 다시 한 번 감사드립니다! – alexa