Как преобразовать следующий код NASM в синтаксис AT & T, чтобы исправить ошибку «не удается обработать неабсолютный сегмент в jmp» - PullRequest
0 голосов
/ 26 декабря 2018

Я новичок в AT & T синтаксисе.Я хочу преобразовать следующий синтаксический код NASM в синтаксис AT & T только для понимания.

Моя попытка преобразовать его в синтаксис AT & T:

lgdt (gdtpointer)

jmp $gdtcode, $_start

gdt:
.quad 0x0000000000000000

gdtcode: 
.word .- gdt
.quad 0x0020980000000000                   

gdtdata: 
.word .- gdt
.quad 0x0000900000000000                   

gdtpointer:
.word .-gdt-1
.quad gdt   

Error: can't handle non absolute segment in `jmp'

Код NASM:

lgdt [gdt.pointer]          

jmp gdt.code:startLongMode

;Global Descriptor Table
gdt:
dq 0x0000000000000000               

.code equ $ - gdt
dq 0x0020980000000000                   

.data equ $ - gdt
dq 0x0000930000000000                   

.pointer:
dw $-gdt-1                  
dq gdt                  

                   ;Ref: Intel System Programming Manual V1 - 2.1.1.1

Пожалуйста, помогите мне понять AT & T.Кроме того, порекомендуйте хороший источник для изучения синтаксиса AT & T (любые книги, учебные пособия и т. Д.)

1 Ответ

0 голосов
/ 26 декабря 2018

В GAS, поскольку определение вашего GDT появляется после jmp $gdtcode, $_start, ассемблер увидит JMP и будет считать, что символ gdtcode является внешним символом (который будет перемещен компоновщиком)а не константа.Из-за этого он будет жаловаться на не абсолютные ссылки.

Вы также неправильно определяете свой GDT, поставив .word .- gdt после gdtcode: и gdtdata.Эти строки будут передавать 16-битное слово в GDT, где вы не хотите их.

Я полагаю, вы, возможно, пытались что-то вроде следующего.GDT определяется в некоторой точке до JMP :

gdt:
.quad 0x0000000000000000

gdtcode:
.quad 0x0020980000000000

gdtdata:
.quad 0x0000900000000000

gdtpointer:
.word .-gdt-1
.quad gdt

CODE64_SEL = gdtcode-gdt
DATA64_SEL = gdtdata-gdt

И затем на более позднем этапе в файле вы можете использовать FAR JMP вот так:

jmp $CODE64_SEL, $_start
...