2016-09-02 7 views
0

프로세서는 숫자를 2의 보수로 나타내는 규칙을 따르므로 어떻게 계산합니까? 두 개의 양수가 더해져도 여전히 긍정적이고 부정적인 것은 아닙니다. 나는 두 개의 32 비트 번호를 추가하는 경우 예를 들어결과가 메모리로 되돌아 갔을 때 프로세서 (특히 ARM)가 실행 중 나중 단계에서 결과를 해석하는 방법

:

하자 R2는 부가가치를 0x50192E32

샘플 코드가 포함되어 여기

add r1, r2, #0x6F06410C 
str r1, [r3] 

오버 플로우 플래그가 설정을 . 아래 그림과 같이 이제 나중에 지침 메모리에서 저장된 결과를 사용하려는 경우 (인해 다른 지침을 지금하고 ... 어딘가에 코드에서 CPSR이 변경되었습니다 프로세서를하자) :

ldr r5, [r3] 
add r7, r5 
그것은, 상기 프로세서는 값을 어떻게 해석 MSB 년대 MSB ienow R5이 1을 가지고있어 상기 제 추가 명령어의 결과는

1있다. 두 개의 양수를 더하면 올바른 결과가 나오므로 양수입니다. MSB에 1이 있기 때문에 음수로 해석됩니까?이 경우 우리는 예상 결과와 다른 결과를 얻습니다. 4 비트 시스템에서

보자

2의 보수 : 0100 = 4 및 5 = 0101; -4 = 1100 -5 = 1,011

이제 4 + 5 = 9하고 1001 같은 레지스터/메모리에 저장되어있는 경우 나중에는 다른 명령에 의해 액세스 지정된 중인지 프로세서는 2의 보수 형식으로 숫자를 저장하고 은 MSB을 확인하고 음수라고 생각합니다.

모두 프로그래머에 따라 다르면 reg/mem에 올바른 결과를 저장하는 방법은 무엇입니까? 어쨌든 정확한 결과를 저장하기 위해 코드를 수행 할 수 있습니까?

+2

2의 보수는 signedness가 산술 연산과 관련이 없다는 것을 의미하므로 'add'는 숫자를 추가합니다. 어떤 것도 코드를 테스트하는 코드가 없기 때문에 아무것도 서명되지 않은 것으로 해석되지 않습니다. (아무 것도 설정하지 않아도되고, 이는 'adds'가됩니다). – Notlikethat

+0

나는 그것이 불분명하다는 데 동의한다. 나는 notlikethat의 주석과 jasonharper의 대답 사이에서 모든 해석을 다루고 있다고 생각합니다. – rjp

+0

어떤 구문에 따라 해당 플래그를 자주 터치하면 S를 추가해야하는지에 따라 vs add가 추가됩니다. –

답변

2

오버 플로우 조건에 신경 쓰면 다른 연산에 의해 상태 레지스터가 덮어 쓰기 전에 오버플로 플래그를 확인해야합니다. 관련 언어에 따라 예외가 생성되거나 연산이 발생할 수 있습니다 긴 정수 유형을 사용하여 재 시도됩니다. 그러나 많은 언어 (예 : C)는 오버플로 조건에 신경 쓰지 않습니다. 결과가 유형 범위를 벗어나면 단순히 잘못된 결과를 얻게됩니다. 그러한 언어로 작성된 프로그램이 오버플로를 감지해야하는 경우 검사 자체를 구현해야합니다 (예 : 추가의 경우 피연산자가 동일한 부호를 가지지 만 결과가 다른 경우 오버플로가 있음).

2

나는 다른 사람들과 같이 여러 번 이것을 다뤘다.

캐리 플래그는 부호없는 오버플로 플래그로 간주하여 추가 할 수 있습니다. 또한 아키텍처에 따라 차용 플래그 또는 차용 플래그를 빌릴 수 없습니다. v 플래그는 더하기 (빼기)를위한 부호있는 오버 플로우 플래그입니다. 당신은 덧셈이나 뺄셈에 대해 덧셈이나 부호 없는지를 아는 유일한 사람입니다.

어떤 플래그인지, 어떤 아키텍처인지는 문제가되지 않습니다. 결과가 중요 할 때까지 결과를 유지하는 경우 (예 : 결과 또는 깃발 일 때) 해당 정보를 보존해야합니다. 당신은 그것을 사용해야합니다, 그것은 프로세서의 일도 아니고 명령어 세트도 아키텍쳐도 아닙니다. 레지스터에 대한 응답은 플래그에 대한 것과 같습니다. 프로그래머 모두에게 있습니다. 네가 신경 쓰면 상태를 유지하라.

if(a==b) 
{ 
} 
stuff; 
stuff; 
I want to do the if a == b thing now. 

그것은 결과를 저장, 그 작품은 대신 다른 시간의 그것을 사용하는 데 필요한 시간에 비교합니까 만들 수있는 프로그래머가 당신의 모든입니다 :이 질문은 당신이이 문제를 해결 어떻게 말처럼 비교할 때 비교할 시간을 확인한 다음 사용하기 전에 검사해야합니다.