2016-11-08 7 views
0

MULU 명령어와 관련하여 질문이 있습니다. 내가 알아챈 한 가지는 데이터 레지스터에 000FFFFF 값이 있다고 가정합니다. 그리고 00FFFFFF를 포함하도록 다른 F를 넣고 싶다고 가정 해 봅시다.68000 어셈블리 : 곱하기가 이상한 결과를냅니다.

MULU #16, D4 

을 그리고 나는 (내가 00FFFFFF를 얻을) 명령을 ADD 수행하여 다른 F를 추가 : 내가 주로하는 일은과 같이 (16)에 의해 데이터 레지스터를 곱합니다. 그러나 000FFFFF에서 다시 곱해지면 데이터 레지스터의 모든 비트가 0이됩니다 (00000000). 그 곱한 후에, 나는 000FFFF0을 갖게 될 것이고, 나머지는 따라 올 것입니다. 나는 아직도이 이유를 이해하지 못한다. 나는 this example을 찾아 보았고 그것이 효과가 있다고 느낀다. 나는 또한 단순히 000FFFFF에 1을 더하면 Extend, Carry 및 Zero 비트 모두가 참이된다는 것을 알았습니다.

+2

무엇 _ "하지만 000FFFFF 다시 곱 때"부호를 유지하기 위해 산술 논리 것보다는 이동합니다 사용해야합니다 _ 뜻? 지시 사항의 정확한 순서를 보여주십시오. 또한 16을 곱하는 대신 4로 왼쪽으로 이동하는 것이 어떻습니까? – Michael

+0

당신 말이 맞아요. 곱셈을해서는 안됩니다. 대신 왼쪽으로 4 시프트하는 것이 좋은 해결책입니다. 문제 해결됨. –

답변

1

곱셈을 사용하지 마십시오. 대신, LSL.L # 4 (레지스터)를 사용하면 훨씬 더 나은 결과를 얻을 수 있습니다.

0

나는이 결과가 68000의 배율 제한 때문에 발생한다고 생각합니다. IIRC는 16 비트 값만 처리 할 수 ​​있으므로이 값을 초과하는 값을 처리하기 시작하면 이러한 결과가 발생합니다.

다른 사람들이 말한 것은 멀리 2의 배수 (왼쪽 시프트)로 값을 곱하는 가장 효율적인 방법입니다. 이는 오른쪽 교대가 효과적으로 가치를 나눌 것이라는 점에서 분단에서도 마찬가지입니다. 당신이 서명 값으로 작업하는 경우

또한, (특히 :) 부문)

+0

사실입니다. 이러한 종류의 곱셈을 수행하면 32 비트 결과가 생성됩니다. –