2016-10-02 3 views
0

모든 플래그를 수동으로 변경할 수있는 방법이 있습니까? 또는 명령을 변경해야하는 결과가있는 명령을 사용해야합니까? 수동으로 플래그 변경 8086

는 기본적으로 나는 명령 RCL 함께 일하고 있어요, 나는 시작 부분에서 1을받지 않으 그래서 나는 0 CF를 변경하려면, 그리고 내가 같은 명령을 사용할 수 있다는 것을 알고 :

mov al, 0 
shl al, 1 

하지만 다른 명령 결과를 사용하지 않고 다른 방법이 있는지 알고 싶습니다.
또한 내가 가르쳐 줄 방법을 알고 싶다면 모든의 플래그와 CF, OF, ZF 등을 실제로 변경할 수 있습니다.

+0

어쩌면 sahf/popf? – Leeor

+0

네, 맞습니다! 대단히 감사합니다! 당신은 나에게 많은 도움을주었습니다 – Argaman

+0

캐리 (canry)는 (답변에서) 전용 지침을 가지고 있지만 운이 좋다면 가끔은 코드를 재정렬 할 수 있습니다. 예를 들어 rcr보다 먼저/xor를 수행하면 코드를 재정렬 할 수 있습니다. CF = 0도. 어셈블리 "골프"의 일부는 가능한 경우 부산물이 재사용되는 방식으로 지시를 주문하는 것입니다. 그러나 이러한 코드는 읽고 이해하기가 더 어렵습니다. 그래서'clc'는 당신에게 딱 맞습니다. 플래그 (RCL이 유효한 필요)를 바꿀 필요가 있다면, CPU가 어떤 식 으로든 할 가능성이 매우 높습니다. 명령어 세트는 전체적으로 잘 작동합니다 (때때로 명확하지는 않지만). – Ped7g

답변

1

eflags을 읽기/쓰기 GP 레지스터로 취급하는 지침은 없습니다. 인텔 1 인용
:

EFLAGS 레지스터의 플래그의 일부

은 ( 다음 절에서 설명) 특수 목적의 지침을 사용하여 직접 수정할 수 있습니다. 전체 레지스터를 직접 검사하거나 수정할 수있는 지침은 없습니다.
프로 시저 스택 또는 EAX 레지스터간에 플래그 그룹을 이동하는 데 다음 지침을 사용할 수 있습니다.
LAHF, SAHF, PUSHF, PUSHFD, POPF 및 POPFD. EFLAGS 레지스터의 내용이 프로 시저 스택 또는 EAX 레지스터 으로 전송 된 후 프로세서의 비트 조작 명령어 (BT, BTS, BTR 및 BTC)를 사용하여 플래그를 검사하고 수정할 수 있습니다. 상태 플래그, 제어 플래그시스템 플래그 :

eflags 레지스터는 세 그룹으로 나누어 져 있습니다. 상태 플래그에만 CF

eflags content

clc, stc, cmc 직접 조작 할 수 있습니다.
CF을 읽을 수있는 지침은 없지만 cmovcc, adc, setcc과 같은 지침을 통해 간접적으로 읽을 수 있습니다. 모든 다른 플래그는 특별히 맞추어 산술 명령 또는 (lahf)와 aheflags상태 그룹 콘텐츠 또는 (pushfd)와 스택 대응하여 변형 및 후면 eflags로 (sahf 또는 popfd)와 이상되어야한다. 제어 플래그 그룹에서

cldstd를 조작 할 수 있습니다 DF 만 있다.
DF의 현재 값을 읽으려면 pushfd을 사용해야합니다.

시스템 플래그은 일반적으로 작업 전환, v86 모드 입력 등과 같은 일부 권한 작업을 수행하여 간접적으로 조작됩니다.
IFclisti으로 직접 조작 할 수 있습니다.
다른 모든 플래그는 pushfd/popfd으로 만 조작 할 수 있습니다. 참고로


:

64 비트 모드
  • 플래그 레지스터 rflags하지만 상위 32 비트가 원경하여 rflagseflags로 처리 예약되어있다.
  • pushfd은 스택에 eflags을 푸시합니다. eflags의 하위 16 비트 만 푸시하는 16 비트 버전 pushf도 있습니다. popfd/popf과 동일합니다.
  • lahf/sahf은 상태 플래그 만 복사합니다.
  • 1 인텔 매뉴얼, 제 1 권, 3.4.3


.

+0

와우 감사합니다. – Argaman