2016-07-09 2 views
3

어셈블리 용으로 약간의 기계 코드 생성기를 쓰고 있습니다.단어/바이트/단어 ptr의 올바른 사용 어셈블리

이의이 3 가지 시나리오를 보자 :

나는 즉시 상수 것입니다 무엇을
add [ebx+04], 0x1 
add [ebx+04], 0x4040 
add [ebx+04], 0x401000 

, 나는 그것이 맞지 수있는 바이트의 가장 작은 수는 무엇을 확인 I 메모리의 지시에 즉시에 관한 질문이 있습니다

add byte ptr [ebx+04], 0x1 

제 2의 들어갈 수 : 다음 나는 그것을 할 가정 있도록 PTR DWORD의 바이트 PTR, 단어 PTR은

먼저 하나가 1 바이트에 들어갈 수 있는지 여부를 가정 나는 것으로 가정 그래서 바이트 : 4 바이트

add word ptr [ebx+04], 0x4040 

세 번째 맞는 나는 그것이 것으로 가정하므로 :

add dword ptr [ebx+04], 0x401000 

이 맞습니까?

+8

아니요. 32 비트 추가 1을 어떻게 생성합니까? PTR 주석은 이유가 있습니다. –

+2

바이트 ptr, 단어 ptr 등의 명명법이 있습니다. 사용자가 어떤 명령/피연산자를 선택할 수 있어야하기 때문입니다. 자신 만의 경우에는 x ptr 대신 addb, addw, addd를 사용할 수 있습니다. –

+1

[ebx + 04]를 추가하면 0x00000001이 dword ptr을 생성합니다. 사용자가 어셈블리 언어에 대한 규칙을 이해하면이 코드를 사용할 수 있습니다. –

답변

5

이러한 종류의 지침에는 크기 태그를 사용해야합니다.

그러나 나는 당신이 바이트 확장 기호에 따라 작은 인코딩을 사용하는 possibiliy을 결정하는 방법이 필요하기 때문에, 숫자에 맞게 알기 위해 코드를 기각 wouln't :

add dword ptr [ebx+4], 1 

이 수를 즉각적으로 4 바이트로 인코딩 할 수 있지만, 더 흥미롭게도 1 바이트의 직접 처리가 가능합니다.

+0

다른 질문이있어서, 8 비트 값을 32 비트로 확장 할 수 있다는 것을 알고 있습니다. 그것은 16 비트에서 32 비트에도 적용됩니까? – Budskii

+1

x86 아키텍처는이 _s-bit_ 부호가 피연산자 크기가 16 비트 일 때 바이트를 워드로 확장하고 피연산자 크기가 32 비트 일 때 바이트를 워드로 확장한다는 것을 정의합니다. 이것은 16 비트에서 32 비트로의 부호 확장을 명확하게 배제합니다. – Fifoernik

3

피연산자 크기를 명시 적으로 지정하는 방법을 구현하고 어셈블러이므로 궁극적으로 이러한 "스마트"공제를 허용할지 여부를 묻는 호출입니다.

강력하게 조언하지만, 프로그래머는 즉각적인 값에 따라 피연산자 크기를 선택하지 않고 오히려 피연산자 크기를 기준으로이 매개 변수를 선택합니다.
간단히 말하면, 우리는 add DWORD [ebx+04h], 1add WORD [ebx+04h], 1 두 개의 완전히 다른 지침을 고려합니다.