Это очень легко сделать с типом географии в SQL Server 2008.
SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm
4326 является SRID для модели эллипсоидальной Земли WGS84
Поскольку я могу только предположить, что вы правильно прочитали сектора в памяти на 0x1000: 0x0000, я могу указать только на потенциальные проблемы в kernel.asm
и gdt.inc
.
Если вы достигли стадии ядра с jmp 0x1000:0x0000
(я подозреваю, что это так), то в kernel.asm
вы неправильно установили DS и ES сегментных регистров до неправильного значения. В этом случае вам необходимо установить эти два регистра в 0x1000, а не 0x0000. Этот код:
xor ax,ax
mov ds,ax
mov es,ax
необходимо изменить на:
mov ax,0x1000
mov ds,ax
mov es,ax
. Следующая важная проблема заключается в том, что запись GDT (внутри toc
) принимает линейный адрес. Линейный адрес в реальном режиме - это то же самое, что и физический адрес. В руководстве по набору инструкций говорится:
Исходный операнд указывает 6-байтовую ячейку памяти, содержащую базовый адрес (линейный адрес) и лимит (размер таблицы в байтах) глобальная таблица дескрипторов (GDT)
blockquote>Вы использовали ORG 0x0000 (поскольку вы не указали один) для
kernel.asm
, поэтому NASM предполагает, что все смещения сгенерированы из базы 0x0000, включая меткуgdt_data
. Поэтому, когда вы это сделаете:toc: dw end_of_gdt - gdt_data -1 dd gdt_data
gdt_data
будет небольшим смещением чуть выше 0x0000. В физической памяти ваша запись GDT на самом деле равна 0x1000: 0x0000 + (небольшое смещение). 0x1000: 0x0000 в физической (линейной) памяти (0x1000 & lt; 4) + 0x0000 = 0x10000, поэтому вам нужно добавить это кgdt_data
. Вашtoc
должен выглядеть следующим образом:toc: dw end_of_gdt - gdt_data -1 dd gdt_data+0x10000
Следующая проблема заключается в том, что вы фактически не включили флаг защищенного режима. У вас есть это:
mov eax,cr0 or eax,1
Это должно быть:
mov eax,cr0 or eax,1 mov cr0, eax
Вам необходимо обновить бит защищенного режима в регистре CR0 после того, как вы установили бит в 1.
В связи с проблемой GDT вы создали записи GDT для сегмента кода из смещения 0x00000000, который охватывают все 4gb адресного пространства. Это верно. Опять же, поскольку NASM создал смещение от 0x0000, и ваш код действительно загружен с 0x1000: 0x0000 (физический адрес 0x10000), вам нужно добавить 0x10000 в значение метки
stage3
в JMP JMP , который, наконец, устанавливает защищенный режим. Кроме того, поскольку мы кодируем значение, превышающее 0xFFFF, нам нужно заставить NASM использовать 32-разрядный операнд, поэтому мы используем квалификаторdword
наJMP
. У вас есть это:jmp 08h:Stage3
Это должно быть так:
jmp dword 08h:Stage3+0x10000