2011-04-11 3 views
0

그래서이 책의 ​​"단계별 어셈블리 언어"는 정말 멋지지만 실제로 메모리와 레지스터 데이터를 작업 할 때 2의 보수가 어떻게 작동하는지에 대해서는 다소 비밀 스러웠습니다. 그와 함께, 나는 서명 된 값들이 메모리에 어떻게 표현되는지에 대해서 확신하지 못한다. 나는 나를 혼란스럽게 만든다. anywho ...ASM 질문, 2의 보수

"-1 = $ FF, -2 = $ FE 등등"이라고 표시됩니다. 이제 저는 2의 보수에 -1이 곱 해져서 원본에 추가되면 0이됩니다. 따라서 FF는 2 진수 11111111과 십진수 255의 16 진수입니다. 그래서 내 질문은 : "-1 = $ FF"라고 할 때 책의 내용은 무엇입니까? -255 + -1은 0을 제공 할 것이지만 OF 플래그를 명시 적으로 설정하지 않았습니까?

실제적으로 우리는 11h, 즉 17 진수이고 00100001은 2 진수라고 가정 해 봅시다. 이 값은 AL입니다. 그러면 NEG AL이됩니다. 그러면 CF와 SF가 설정되고 AL의 값이 소수점 239, 이진수 11101111 또는 EFh로 변경됩니다. 그게 17 * -1이 될지 모르겠다. 아니면 그 책이 잘못 말한 설명 일뿐입니다. 실제로는 오버플로를 유발하는 데 필요한 가치를 제공한다는 의미입니까?

감사합니다.

답변

1

2의 보수로, 바이트의 경우 (-x) == (256 - x) == (~x + 1)입니다. (~은 피연산자의 모든 비트를 반전하는 NOT 연산자의 C'ish입니다.)

11h가 있다고 가정 해 봅시다.

100h - 11h == EFh 
(256 - 17 == 239) 

참고로 256 바이트는 크기가 8 비트이기 때문에 작동합니다. 16 비트 단어의 경우 2^16 (65536), dwords 2^32를 사용합니다. 또한 없습니다/+ 1,

~11h = EEh 
+1... EFh 

이 방법은 모든 규모의 단어를 작동 사용하는 등, 모든 수학 바이트 256, 반바지 65536 모드입니다

주의 또는.

+0

빠른 답변을 보내 주셔서 감사합니다. 알았어. 알았어. 그래서 지금 내 질문은, 이런 종류의 표기법이 성취한다는 것입니다. 1과 2의 보수가 모두있는 이유는 무엇입니까? –

+0

2의 보수는 부호있는 숫자를 나타내는 매우 편리한 방법이기 때문에 일반적입니다. 'x - y == x + -y', 일관되게. IP에서 체크섬 (IIRC)으로 사용하는 것 이외에, 좋은 점이 무엇인지 잘 모르겠습니다. – cHao

+0

@ 제로 : 내 기억은 2의 보수입니다 일반적으로 하나의 보완에 비해 하드웨어 구현 (약간의 경우 하드웨어 논리에 빼기 또는 뭔가 특별한 경우가 필요하기 때문에)보다 간단합니다. 또한 0에 대한 표현이 하나 뿐인 이점이 있습니다 (하나의 보수에는 '음수 0'이 있음). 생각할 수있는 2의 보완에 대한 유일한 단점은 음수보다 표현할 수있는 양수가 적다는 것입니다. 예를 들어, 서명 된 문자는'-128'까지 내려갈 수 있지만'127'까지만 올라갈 수 있습니다. 그 음의 제로는 어딘가로 가야했다. –

0

"-1 = $ FF"라고 쓰여 있으면 어떻게 될까요?

(16 진수 번호에 대한 해당 형식을 사용하는 경우 또는 $FF) 바이트를 고려하는 것은 단지, 1의 2의 보수가 0xff 경우. 0xff 마찬가지로

2에 대한 : 보수가 0xfd 인의를 얻을 수 1를 추가

, 1의 보수 (또는 1의 보수를)을 분해 한 다음 2의 보수를 얻을 수 1를 추가, 0xfe입니다 2의 보수 : 0xfe

이제 10 진수를 살펴 봅시다. 말씀하시는대로, 0x11입니다. 보완은 0xee이고, 2의 보수는 0xef입니다. 귀하가 귀하의 질문에 명시한 것과 일치합니다.

이제 숫자를 함께 추가하면 어떻게 될지 실험 해보십시오.

이제
17 + (-17) == 0 

진수의 : 진수 먼저 크기 만 바이트의 숫자 객체를 처리하고 있기 때문에, 0x1001이 삭제됩니다

0x11 + 0xef == 0x100 

(일부 손 여기 흔들며. ..), 우리는 결과 :

0x11 + 0xef == 0x00 

는 (아마 불행하게도, 이해할 수있는 방식으로이 작업을 수행하지 않습니다) '손 흔들며'처리하기 위해 : 오버플로 플래그 (OF 또는 때로는 V라고 불리는 이유로) 캐리 플래그 (C)와 동일하므로 캐리를 무시할 수 있습니다 (부호있는 연산이 올바르게 발생했음을 나타냅니다). 아마 그다지 정확하지는 않지만 아마도 유용하다고 생각하는 한 가지 방법은 음의 2의 보수 값에서 선두의 값이 음수가 아닌 2의 보수 숫자에서 0을 선두로하는 것과 동일하다는 것입니다.