2008-08-20 9 views
5

이것은 하위 레벨 시스템 질문입니다.nasm과 32 비트 및 16 비트 코드 믹싱

보호 모드에서 리얼 모드로 돌아가려고하기 때문에 32 비트와 16 비트 코드를 혼합해야합니다. 약간의 배경 정보로서, 내 코드는 GRUB 부팅 직후에 이렇게하고있다. 그래서 내가 할 수있는 일과 할 수없는 일을 알려주는 성가신 운영체제가 없다.

어쨌든, 내 어셈블리에서 [BITS 32]와 [BITS 16]을 사용하여 어떤 종류의 연산을 사용해야 하는지를 nasm에게 알려주지 만, 코드를 사용하여 보쉬를 테스트 할 때는 보쉬가 아닌 것처럼 보입니다. 내가 작성한 코드를 실행한다. 어셈블러가 bochs를 혼란스럽게하는 0x660x67에 붙어있는 것처럼 보입니다.

그래서, 같은 파일에 32 비트와 16 비트 코드를 혼합 한 코드를 성공적으로 어셈블하는 방법은 무엇입니까? 어떤 종류의 트릭이 있습니까?

답변

0

저수준에 대해 농담을하지 않았습니까?

생성 된 opcodes/operand를 확인하여 nasm이 BITS 지시문을 올바르게 따르고 있는지 확인 했습니까? 또한 점프 대상이 올바른지 확인하십시오. 아마도 nasm이 잘못된 오프셋을 사용하고 있습니다.

nasm에서 버그가 아닌 경우 boch에 버그가있을 수 있습니다. 저는 사람들이 32 비트 모드에서 16 비트 모드로 전환하는 것을 더 이상 상상할 수 없습니다.

3

0x66 및 0x67은 다음 opcode가 기본값이 아닌 비트로 해석되어야 함을 나타내는 데 사용되는 opcode입니다. 더 구체적으로 말하면, (this link에 따라)

"NASM이 BITS 16 모드에있는 경우 32 비트 데이터를 사용하는 명령어 앞에 0x66 바이트가 붙고 32 비트 주소를 나타내는 명령어에는 0x67 접두어가 붙습니다. 32 비트 명령어는 접두어가 필요없고 16 비트 데이터를 사용하는 명령어는 0x66이 필요하고 16 비트 어드레스를 사용하는 명령어는 0x67이 필요합니다. "라고 BITS 32 모드에서 역으로 적용됩니다.

이것은 결점이있는 보크임을 나타냅니다.

0

리얼 모드에있는 경우 기본 크기는 암시 적으로 16 비트이므로 BITS 16 모드를 사용해야합니다. 이 방법은 32 비트 피연산자 크기가 필요하면 0x66 접두어를 추가하고 32 비트 주소 크기는 0x67 접두사를 추가합니다.

인텔 IA-32 소프트웨어 개발자 가이드, 3 권, 16 장에서

봐는 (16 비트 및 32 비트 코드를 혼합하는 단계; 장 번호는 책의 개정판에 따라 변경 될 수 있습니다) :

실제 주소 모드, 가상 8086 모드 및 SMM은 기본 16 비트 모드입니다.

BITS 32 지시문은 보호 모드 나 긴 모드 이외의 모드에서 어셈블러를 혼동하는 경우에만 혼동을줍니다.

6

설명자 테이블을 올바르게 설정하지 못하는 것으로 밝혀졌습니다. 나는 1 비트가 틀리게 뒤집어 져서 16 비트 모드로가는 대신에 32 비트 모드로 가고 있었다. (세그먼트는 1 메가의 한계가 있었다.)

제안 해 주셔서 감사합니다.

테리

+1

힌트 :이 경우 자신의 대답을 수락하십시오. – Joshua