프로세서는 숫자를 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의 보수는 signedness가 산술 연산과 관련이 없다는 것을 의미하므로 'add'는 숫자를 추가합니다. 어떤 것도 코드를 테스트하는 코드가 없기 때문에 아무것도 서명되지 않은 것으로 해석되지 않습니다. (아무 것도 설정하지 않아도되고, 이는 'adds'가됩니다). – Notlikethat
나는 그것이 불분명하다는 데 동의한다. 나는 notlikethat의 주석과 jasonharper의 대답 사이에서 모든 해석을 다루고 있다고 생각합니다. – rjp
어떤 구문에 따라 해당 플래그를 자주 터치하면 S를 추가해야하는지에 따라 vs add가 추가됩니다. –