2017-11-20 28 views
-1

-4가 EAX 레지스터에 복사된다는 것을 알고 있습니다.우리가 mov eax 할 때 어떻게됩니까? -4?

나의 의심은 :

  • -4 EAX 여부에 복사하기 전에 2의 ​​보수 바이너리 표기로 변환됩니다?

  • 2의 보수 바이너리 표기법으로 변환하면 누가 작업을 수행합니까?

  • 음수를 나타내는 데 특별한 opcode가 있습니까?

  • EAX 레지스터에 저장할 수있는 최대 음수는 얼마입니까?

  • 부호가있는 산술을위한 특별한 연산 코드 나 명령어가 있습니까?

CPU에서 음수와 양수를 곱하면 어떻게됩니까?

+0

_ "CPU에서 음수와 양수를 곱하면 어떻게됩니까?"_ 나누기 및 곱셈 [인텔 설명서] (https://www.intel.com/content/dam/www/)을 참조하십시오. public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf)? – Michael

+0

전환이 진행되는 한 런타임에는 전환이 발생하지 않습니다. 즉치 피연산자가있는 'mov'는 코드를 어셈블 링하고 링크 할 때 명령어로 인코딩 된 비트를 단순히 복사합니다. 인텔 매뉴얼 1 권 : "부호있는 정수는 바이트, 단어, 더블 워드 또는 쿼드 워드로 유지되는 부호있는 이진수입니다 부호있는 정수의 모든 연산은 2의 보수 표현을 가정합니다 부호 비트는 비트 7의 바이트 정수 , 단어 정수의 비트 15, 더블 워드 정수의 비트 31 및 쿼드 워드 정수의 비트 63 (표 4-1의 부호있는 정수 인코딩 참조) "_ – Michael

+0

감사합니다. @Michael –

답변

1

2의 보수 바이너리로의 변환은 어셈블러에서 수행합니다. 어셈블러에서 내 보낸 기계 코드에는 이진 형식의 데이터가 들어 있습니다.

일부 opcode는 데이터를 부호없는 값으로 해석하고, 일부는 부호있는 값에 대해 작동하고, 일부 opcode는 모두에 대해 동일하게 해석합니다. 특히 음수에 해당하는 연산 코드는 없습니다.

부호가있는 숫자로 해석 될 때 eax의 범위는 -2^31 .. 2^31-1입니다.

음수를 양수로 곱하면 부호있는 곱하기 명령어를 사용하고 오버플로가없는 것으로 가정하면 올바른 음수 결과가 2의 보수 값으로 제공됩니다.

+0

in c 우리는 부호를 지정하기 위해 부호있는 부호없는 정수, x86 어셈블리에서 부호있는 정수와 부호없는 정수를 지정하는 방법을 선언합니까? –

+0

데이터와 함께 유형을 나타내지는 않습니다. 데이터 유형은 조작을 수행하는 데 사용되는 opcode에 의해 제어됩니다.다른 opcode를 사용하여 동일한 데이터로 부호있는 곱하기와 부호없는 곱하기를 모두 수행 할 수 있습니다. – prl

+0

이므로 데이터는 바이너리이지만 다른 opcode는 바이너리를 다르게 봅니다. 내가 맞습니까? –