2017-01-22 1 views
0

:어셈블러, SUB 명령어의 7 번째 비트는 무엇입니까? 나는 이런 식으로 뭔가를 가지고 대학에서받은 내 논문에서

SUB 
1. Subtracting value from register 
| 100000 s w | 11 101 reg | value(L) | value(...) | value(...) | value(H) | 

나는 "w"가 무엇의 약자인지 안다. "reg"필드의 레지스터가 8 또는 16/32 비트인지 여부를 지정하지만 "s"옵션은 무엇입니까? 그것은 무엇을 의미합니까? 나는 인터넷을 통하여 찾았다. 그러나 나는 havent 명백한 대답을 발견했다.

+7

_ "인터넷을 통해 검색했지만 명확한 답변을 찾지 못했습니다."_ 인터넷을 검색 할 필요가 없습니다. _Intel® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서를 참조하십시오. 어쨌든,이 비표준 서술에서's'는 직접 피연산자의 부호 확장을 나타내는 것으로 보입니다. – Michael

답변

2

s은 표지 확장을 나타냅니다.

SUB80-83은 sub reg, imm을 나타낸다. 여기

http://ref.x86asm.net/#column_flds를 알 수있는 바와 같이

SUB 버전 82, 83 기호는 즉각적인 오퍼랜드 연장

와트는 (비트 인덱스 0, 피연산자 사이즈) w 비트가 존재하는 수단; 비트 d 또는 s와 결합 될 수있다. 04 ADD s는 비트 s (비트 인덱스 1, 부호 확장)가 있음을 의미합니다. 비트 w와 결합 될 수있다. 6B IMUL.

이 값을 사용하면 즉각적인 피연산자가 더 작아 지므로 코드가 더 작아집니다. http://ref.x86asm.net/geek.html

주 그 바이트 피연산자 모두 80과 82 나타낸다 산술 :

당신은에서 전체 연산 코드 맵을 볼 수 있습니다. 80은 없으며 82는 기호 확장자입니다. 그러나 byte 피연산자의 부호 확장은 no-op이므로 82는 80의 별칭입니다.
Intel은 중복 된 opcode를 용도 변경하지 않고 공식 80 개의 별칭으로 사용할 수 있도록 선택합니다.

x86 opcode 맵에는 약 12 ​​개의 별칭이 있으며, 인텔이 디코딩 문제에서 단순히 더 많은 실리콘을 던질 수 없었던 날부터 계속됩니다.

+0

opcode 0x82는 opcode 0x80의 문서화되지 않은 별칭입니다. 바이트 뺄셈을 수행 할 때 실제로는 부호 확장 할 것이 없습니다. – fuz

+0

'sub al, 7 '을'80 E8 07'로 인코딩하는 것이 맞습니까? – DualCore

+0

@DualCore 맞습니다. – fuz

관련 문제