2011-12-13 6 views
0

저는 16 진수 기계 명령어를 기호화 된 opcode로 변환하는 것과 혼동합니다.조립 언어 기호 opcode

What machine code is generated for the instruction: sbb al, 10 
sbb reg/mem from reg/mem 0001 10dw | mod reg r/m | disp-lo | disp-hi 
sbb immed from reg/mem  1000 00dw | mod 101 r/m | disp-lo | disp-hi | disp-lo | disp-hi 
sbb immed from accumulator 0001 110w | data-lo | data-hi 
Answer: 01C0A 

What is the symbolic opcode for this hex machine instruction: F7 26 10 00 
I converted F7 to 1111 0111 and this matches up with these instructions 
mul 1111 011w | mod 100 r/m | disp-lo | disp-hi 
imul 1111 011w | mod 101 r/m | disp-lo | disp-hi 
div 1111 011w | mod 110 r/m | disp-lo | disp-hi 
idiv 1111 011w | mod 111 r/m | disp-lo | disp-hi 
Answer: mul 

내가 어떻게이 문제를 처리하는 방법 아무 생각 나는 개념 주위에 내 머리를 정리하고 수없는 것 : 나는이 부분에서 몇 가지 검토 문제가있다. 누군가가 더 간단한 용어로 나를 부술 수 있습니까? x86

답변

2

sbb al, 10에 대한 여러 가지 가능성이 있지만 리소스가 잘못되었거나 잘못된 데이터를 선택했다고 올바르게 알 수 있습니다. 여기에 인텔의 매뉴얼에서이다 :

SBB – Integer Subtraction with Borrow 

immediate to register  1000 00sw : 11 011 reg : immediate data 
immediate to AL, AX, or EAX 0001 110w : immediate data 

두 번째 인코딩을 사용하는 경우에는 2 바이트 명령을받을 : 1Ch, 0Ah은. w은 바이트 크기 피연산자로 작동하는 명령어를 (d/q) 워드 크기 피연산자로 구분합니다. 여기서 w = 0은 피연산자가 바이트이기 때문에 0입니다. wsbb (r/e)ax, imm 일 때 1이됩니다.

이제 첫 번째 인코딩을 사용하면 3 바이트 명령어가 생성됩니다. w은 같은 의미입니다. s은 즉시 (d) 워드 크기의 명령어를 즉각적인 바이트 크기의 명령어와 구별합니다 (명령어 설명을 자세히 보면 직접적인 피연산자 크기 만 다른 두 가지 형식이 있음을 알 수 있습니다). 여기에서 즉치는 바이트 크기이기 때문에 s = 0입니다. reg은 레지스터 색인입니다. al (및 (r/e)ax)은 0입니다. 도착하면 80h, 0D8h, 0Ah입니다.

두 인코딩은 모두 sbb al, 10의 유효한 인코딩이지만 일반적으로 짧은 것이 좋습니다.

Intel 및 AMD CPU 매뉴얼을 반드시 읽어야합니다. 명령어 세트와 명령어 인코딩이 포함되어 있으며, 여러 테이크에서 여러 번 읽히고 Intel과 AMD를 모두 읽어야합니다. 필요한 모든 정보가 있습니다. 단지 많은 정보가 있으며 학습에 적합한 최상의 형식이 아닙니다.

명령어 인코딩에 대한 이해를 확인하려면 어셈블러, 디스어셈블러 및 디버거와 같은 도구를 사용하십시오. 예를 들어 코드에 sbb al, 10 대신 db 80h, 0D8h, 0Ah 또는 db 1Ch, 0Ah을 쓰고 컴파일 한 다음 분해 해 보면 실제로는 sbb al, 10인지 확인할 수 있습니다. 여기 저기에있는 다양한 비트를 바꿀 수 있으며 해체시 변경 사항을 확인할 수 있습니다.