2012-12-22 3 views
5

나는 천천히 놀기 위해 천천히 osdev에 들어가려고 노력하고있다.왜 "또는 아, 아"?

This tutorial은 드라이브가 준비 될 때까지 기다립니다 어셈블리의 조각이 있습니다

reset_drive: 
    mov ah, 0 
    int 13h 
    or ah, ah 
    jnz reset_drive 

나는 장치가 준비 경우 인터럽트 후, ah가 0이됩니다 것을 얻을. 그러나 or ah,ah은 무엇을합니까? 약간 중복 된 것 같습니다 ... 아무 것도하지 않는 것처럼 보입니다. (적어도 내 논리에 의해) 그것은 무엇을 하는가?

+1

'test ah, ah' (https://stackoverflow.com/a/33724806/224132)의 비효율적 인 방법입니다. 특히 8 진수 레지스터에 쓰기가 부분 레지스터 병합을 만들기 때문에 인텔 CPU, 심지어 Skylake에 관한 문제. –

답변

12

ah이 0인지 여부에 따라 ZERO 플래그를 설정/해제합니다.

는 플래그의 상태에 따라 jnz reset_drive는 이동합니다 : ah하지 제로 경우에만.

즉, ah이 0이 된 후 반복을 중지하므로 장치가 준비 될 때까지 대기합니다.

+0

와우. 나는'ZF'에 대해 몰랐다. 빠른 답변 주셔서 감사합니다! –

+2

@Matt 환영합니다. 기본적으로 모든 산술 연산은'ZF'와 다른 플래그를 설정/해제합니다. 이것은'or'에 배타적이지 않습니다. – phant0m

+0

dcpu-16 어셈블러에 대한 경험이 있지만 x86에서 그렇게 열정적이지 않습니다. dcpu는 훨씬 이해하기 쉽습니다. –

관련 문제