2016-11-29 11 views
2

저는 코드와 운영체제가 실제로 어떻게 작동하는지 배우기 위해 어셈블리를 가르치기 시작했습니다. 내가 알기에, 은 프로세서에게 foo 라벨이있는 라인으로 가도록 지시합니다. 그러나 (이 정말를 호출 할 수 있다면!) 가장 기본적인 OS는이 코드를 알고있는 것처럼, 프로세서 라인 1을보고하고 foo 것을 기억어셈블리에서 jmps는 어떻게 작동합니까? (OS 개발)

foo:       ; label foo 
    jmp foo     ; Go to foo 
    times 512-($-$$) db 0  ; Fill remaining bytes with 0's 

... 다음과 같습니다. 그런 다음 2 행으로 이동하여 foo으로 이동합니다. 그리고 빈 공간을 채우기 위해 3 행에 도달하지 마십시오.

무한 루프가 아닌 이유는 무엇입니까? 컴파일시 VirtualBox에서 잘 실행됩니다 (여기에 올바른 단어를 사용합니까?) .iso 파일에 포함됩니다.

+0

'jmp'는 간단히 "여기에서 X 바이트를 가져옵니다."입니다. 그것은 당신이 말한 것과 비슷하지만 물론 라인이 아니라 주소를 지정합니다. 줄의 관점에서 "여기에서 X 줄로 점프"하고 "jmp foo"는 "여기에서 점프 -1 줄"이 될 것입니다. 물론 이것은 유추 일뿐입니다. –

+0

@MargaretBloom 맞습니다. 그러나 세 번째 줄은 어떻게 실행 되었습니까? ? – seadoggie01

+6

** **는 ** 무한 루프이며 세 번째 줄은 명령어가 아니며 섹터의 나머지 부분을 0으로 채우는 어셈블러 지시자입니다. 어셈블하는 동안 어셈블러에 의해 "실행"됩니다. – Jester

답변

3

첫 번째 일; 이것은 어셈블리 코드이므로 프로세서가 직접 실행하는 것이 아닙니다. 어셈블러가 여기서 역할을합니다. 어셈블리 코드를 스캔하고 기계 코드를 작성합니다. Instructions의 시퀀스입니다 (데이터도 있음).

은의이 코드에 프로그램에서

foo:       ; label foo 
jmp foo      ; Go to foo 
times 512-($-$$) db 0   ; Fill remaining bytes with 0's 

어셈블러 모양을 제공 할 수 있습니다. "foo"즉 0x00000000 (ZERO)의 주소를 저장합니다. 첫 번째 명령어는 0x00000000 (라벨에는 크기가 없음)의 주소에서 점프하여 프로세서가 foo로 점프하여 0x00000000으로 점프하도록 지시합니다. 그래서 어셈블러는 바이너리 파일을 만들고, "jmp"명령 머신 코드를 넣고 주소 필드에 0x00000000을 넣습니다.

다음 번 "이것은 기계 실행 가능 코드가 아닙니다. 오히려 어셈블러가 후속 명령을 n 시간 작동하도록 알려주는 어셈블러 키워드입니다. 주소가 512가 될 때까지 "0"바이트로 나머지 공간을 채우십시오.

그래서 Output 바이너리는 다음과 같이 보입니다.

enter image description here

그래서 실제로는 무한 루프입니다!