2014-03-06 1 views
3

그래서 저는 X 박스 용 프로젝트를 간단히 뒤집을 때 PowerPC를 배워 보았습니다. 그러나 저는 항상 이런 일에 매달려 있습니다.PowerPC의 레지스터 값과 혼동이 있습니까?

lwz  r11, 0(r29) # Loads 0x34 from 0x10710 and stores in r11 
    lwz  r10, 4(r29) # Loads 0x64 from 0x10714 and stores in r10 
    addi  r11, r11, 0x7F # r11 = 0x34 + 0x7F = r11 = 0xE3 
    clrrwi r10, r10, 7 # r10 = r10 (0x64) + 0xFFFFFF80 
    clrrwi r31, r11, 7 # r31 = r11 (0xE3) & 0xFFFFFF80 

어쨌든 내가 이해하는데 어려움을 겪고있는 것은 마지막 두 줄입니다. 어떻게 등록 원이 하나의 값 + 다른 값을 가질 수 있습니까? 그리고 또 다른 레지스터가 어떻게 하나의 값을 가질 수 있습니까? &? 그리고 만약 내가 다음 줄에 추가했다면, 나는 어떤 가치를 더할 것인가? 미안 해요, 제 모국어가 C++과 C# 이래로 이상한 전환입니다. 나는이 문제를 포기하고 싶지 않습니다. 문제가 있음에도 불구하고 너무 재미 있습니다.

답변

4

"# r10 = r10 (0x64) + 0xFFFFFF80"주석에서 '+'를 이해할 수 없으며 오타가 될 수 있습니다. 그러나 다음 줄의 주석은 이해할 수 있습니다. "# r31 = r11 (0xE3) & 0xFFFFFF80 "입니다.

의 '왼쪽 단어 즉시 반전 후 AND Mask M-form'을 보면 clrrwi에 실제로 수행 된 작업이 표시됩니다.

clrrwi 수신 Ry가, N

하기 때문에 거기

rlwinm 수신 Ry가, clrrwi 들어

가 rlwinm 회전 단어 0 비트 왼쪽 0,0,31-N에 상당 clrrwi 명령에 대한 회전이 없습니다. 비트 0-24에 1을, 그 밖의 곳에 0을 갖는 마스크를 생성하므로 n = 7에 대해 생성 된 마스크는 0xFFFFFF80입니다. 회전 된 데이터는 생성 된 마스크와 AND 연산을 수행하므로 두 번째 clrrwi에 대한 설명이 적합합니다. clrrwi는 단어의 오른쪽 n 비트를 지우는 마스크를 생성하고 0xFFFFFF80은 지우는 데 사용되는 마스크입니다.

그런데 0x34 + 0x7F = 0xB3입니다.

+0

고마워요! 아직도 나에게 혼란 스럽지만, 나는 거기에 가고있다. 그리고 수정 된 0xE3 주셔서 감사합니다, 내가 잘못 읽은 것 같아요! – user3371785

관련 문제