2017-03-22 3 views
0

나는 x86 구문을 배우고 있습니다.명령어가 무엇을하는지 이해하십시오.

나는 그것이 무엇을해야하지 않는 것이 명령을 우연히 발견했습니다

cmpl $0x0,%cs:0x6574 

나는 cmp 그냥 차이를 비교하고 플래그를 설정 알고있다. 부호없는 값이 비교 중임을 나타내는 l.

내 질문은 :

우리는 무엇을 비교합니까?
0x0의 값과 어떤 값 %cs:0x6574?
cs 레지스터에 주소가 들어 있습니다. 0x6574를 추가하고 값을 추출해야합니까? 다음과 같습니다.

mem[cs+0x6575] 

미리 감사드립니다.

+1

될 것입니다. 이 OS 개발과 관련이있을 수 있습니까? 특히 JOS 관련 실제 코드를보고 계십니까? –

+0

@MichaelPetch nice! 예. OSE, 나는 JOS 부트 스트랩 코드를보고있다. –

+1

CMPL 명령이 사용되기 바로 전에'ljmp $ 0xf000, $ 0xe05b'이 수행됩니다. 그 긴 점프는 CS를 $ 0xf000 및 IP를 $ 0xe05b로 설정하는 효과가 있습니다. '% cs : 0x6574'는 (0xf000) * 16 + 0x6574가됩니다. 그것이 실제 주소 0xf6574입니다. 그 위치에 무엇이 있는지 알기 위해 OSE/JOS 코드를 보지 않았지만 실제 주소 0xf6574의 긴 단어 (4 바이트 값)와 값 0을 비교하는 것이 좋습니다. –

답변

1

이것이 리얼 모드 코드에서 가정하면 기본 세그먼트 재정의입니다. 따라서 암시 적 DS 대신 CS 세그먼트를 사용하십시오. 리얼 모드의 주소 계산은 약간 다릅니다. 세그먼트 값에 처음 16을 곱하고 오프셋을 더합니다.

그래서 당신의 표기법에서 이것은 AT & T 구문 (안 86 구문)입니다

mem[16*cs+0x6575] 
+0

좀 더 자세히 설명해 주시겠습니까? 레지스터에 저장된 가상 주소입니까? 그래서 번역을해야만 했나요? 아니면 cs가 세그먼트를 가리키고 있습니까? –

+0

'mov $ 0xf3c24, % edx'은 어떨까요? edx에'0xf3c24'에 값을 저장합니까? 또는 edx에 '16 * 0xf3c24 + 0'의 값을 저장합니까? 나는 단지 내가 더 잘 이해할 수 있도록 묻는다 : –

+0

번역은 항상 리얼 모드에서 이루어진다. 실제 실제 주소는 세그먼트 * 16 + 오프셋입니다. 이것은 CPU 내부에서 수행됩니다. 오프셋을 사용하면 중요한 것은 오프셋 된 것뿐입니다. 물론 추가 주소 지정 모드가 있으므로 [base * scale + index + offset]을 사용할 수 있습니다. – Anty

관련 문제