2009-04-27 2 views
23

CF는 부호없는 캐리 아웃을 나타내고 OF는 부호있는 오버플로를 나타내는 것으로 알려져 있습니다. 그렇다면 어셈블리 프로그램은 부호없는 데이터와 서명 된 데이터를 어떻게 구별 할 수 있습니까? (타입 정보를위한 추가 메모리 저장을 통해, 또는 위치 정보를 통해 또는 다른 것을 통해?) 그리고이 두 플래그는 서로 바꿔서 사용할 수 있습니까?어셈블리 약 CF (캐리) 및 OF (오버플로) 플래그

답변

32

데이터 자체가 아닌 데이터를 조작하기 위해 어떤 지침이 사용되는지 구분해야합니다. 현대 컴퓨터 (1970 년경 이후)는 덧셈과 뺄셈이 부호가있는 숫자와 부호없는 숫자에서 똑같이 작동하는 2의 보수라고하는 정수 데이터 표현을 사용합니다.

  • 표현의 차이

    는 최상위 비트에 주어진 해석 (또한 부호 비트라고도 함). 부호가없는 숫자의 경우 비트는 매우 큰 양수를 의미합니다. 매우 큰 음수 (절대 값이 큰 음수)를 의미하는 부호있는 숫자의 경우.

  • 다른 명령어는 동일한 비트의 다른 해석을 사용할 수 있습니다. 예를 들어, 대부분의 큰 머신은 부호있는 부호없는 부호있는 곱하기 명령어를 모두 가지고 있습니다. 「보다 작게 설정」되어있는 머신에는, 부호 첨부 및 부호 없음의 양쪽 모두가 있습니다.

  • OF (오버플로 플래그)는 캐리가 결과의 최상위 비트 부호를 뒤집어 인수의 최상위 비트와 다른지 여부를 알려줍니다. 숫자가 부호없는 것으로 해석되면 오버플로 플래그는 관련이 없지만 부호로 해석되면 OF는 예를 들어 두 개의 큰 양수가 추가되고 결과는 음수입니다.

  • CF (carry flag)는 비트가 단어 전체에서 (예 : 비트 33 또는 비트 65로) 수행되었는지 여부를 나타냅니다. 숫자가 부호없는 것으로 해석되면 carry 플래그는 덧셈이 오버플로되어 결과가 너무 커서 기계 단어에 맞지 않음을 의미합니다. 오버플로 플래그는 부적합합니다.

    • 그것은 CF 또는 서명에 수행 할 또는 부호없는 비교 중 하나를 선택할 수 있습니다 :

    귀하의 질문에 대한 대답은 그 어셈블리 코드 서명되지 않은 데이터에서 서명 구별하는 몇 가지 방법을 가지고 있습니다.

  • 부호있는 또는 부호없는 곱하기 및 나눗셈 명령을 선택할 수 있습니다.
  • 부호있는 또는 부호없는 오른쪽 시프트를 선택할 수 있습니다 (부호는 상위 비트를, 부호없는 시프트는 0으로 복사합니다).
+0

'어느 쪽이라도 가능'하지만 어셈블리 코드는 가장 의미있는 것을 선택합니다 (하나의 의미가 있습니다)? – Pwn

+7

부호있는 숫자의 경우 최상위 비트는 "큰 음수"를 의미하지 않으며 "음수"를 의미하지 않습니다. – MarcH

+0

우리는 CF도 [Borrow Bit] (http://en.wikipedia.org/wiki/Carry_flag) – Tony

-3

나는 당신이 어떤 플래그를 사용할지를 결정하는 사용하는 동작에 근거한다고 생각합니다. 예 : 서명 된 대 서명되지 않은 추가. 그래서 당신이 원하는 모든 명령으로 기억과 놀 수 있다고 가정합니다.

1

일반적으로 어셈블리 프로그램은 서명 여부를 나타내는 변수와 관련된 특별한 정보를 가지고 있지 않습니다. 프로그래머가 어떤 플래그를 언제 사용해야하는지, 어떤 조건을 사용해야하는지 (예 : JG 대신 JA 사용)를 아는 것은 작업입니다.

그래서 어떤 명령 유형을 사용할 수 있는지 알기 위해 작업 할 변수의 유형을 알아야합니다. 이것이 프로그래머가 signed/unsigned 타입을 사용할 때 (즉, 명시 적 캐스트없이) 경고를주는 이유입니다. 하드웨어에서 수행 할 수 있지만 예기치 않은 결과가 발생할 수 있기 때문입니다.

4

그렇지 않습니다. 조건이 발생할 때마다 플래그가 설정됩니다. 프로그래머는 그가 처리하고있는 int의 유형을 알고 있어야하고, 그가 신경 쓸지를 검사 할 플래그가 무엇인지 알고 있어야합니다.

5

부호가있는 데이터와 서명되지 않은 데이터를 처리하기위한 다양한 opcode가 있습니다. 프로그램이 두 개의 부호있는 정수를 비교하고 싶은 경우는 옵 코드를 사용 jl, L 및 g는 각각 리터 ESS 및 g reater 스탠드 jle, jgjge. 프로그램이 두 개의 부호없는 정수를 비교하고 싶은 경우, jb, jbe, jajae, 어디 보브와 B elow의 a와 b 스탠드는 각각 옵 코드를 사용합니다. 모든 경우에 e는 '같거나 같음'을 의미합니다. 이러한 opcode는 비교를 기반으로하는 분기에 사용됩니다.

마찬가지로, 비교에 따라 바이트를 0 또는 1로 설정하는 setCC 명령어가 있습니다. 이러한 기능은 동일하게 - setl, setle, setg, setge, setb, setbe, seta, setae 등이 있습니다.

서명 된 opcode는 플래그 ZF, OF 및 SF를 테스트합니다. 부호없는 연산 코드는 플래그 ZF, CF 및 SF를 테스트합니다. 테스트 된 정확한 조건은 JCC 지침과 setCC 지침에 대한 80386 프로그래머 참조 설명서 섹션을 참조하십시오.

3

바이트/단어/긴 형식을 테스트하고 반환하도록 CPU에 요청할 방법이 없습니다.

0xFF는 "255"또는 "-1"을 포함 할 수 있습니다. 이는 모두 프로그램에서 말하는 바이트 유형에 따라 다릅니다.

"type", "signess"등과 같은 구문은 CPU 수준이 아닌 Java와 같은 고급 언어에만 존재합니다. 결국 모든 것이 CPU에 바이트입니다.이 값들을 intrepret하고 조작하는 방법을 체계화하고 알기 위해 우리 프로그램에 달려 있습니다 ...

CPU 플래그가 상태에서 발견되면 어떤 패러다임도 시행하지 않습니다 그에 따라 테스트하고 반응하는 코드.

Intel CPU에서 MMX 및 FPU 레지스터는 실제로 동일한 레지스터를 차지합니다. 따라서 FPU와 MMX 유형 명령어를 동시에 혼합하는 것은 불가능합니다. 한 연산의 값이 다른 연산을 낭독 할 것이기 때문입니다. 프로그램은 일반적으로 FPU 명령을 발행하는 것과 같이 하나의 모드로 작업을 완료 한 다음 MMX를 시작하지만 동시에 둘 모두를 시작하지 않아야합니다.

16

부호를 조작하지 마십시오. 그건 불가능합니다. 대신, 진실을 깨닫려고 노력하십시오. 그렇다면 차별화되는 표지판 유형이 아니라는 사실을 알게 될 것입니다.