#assembly #nasm #gnu-assembler
Вопрос:
Переводить.код раздела данных от nasm до gas. раздел данных nasm:
TssDesc:
dw TssLen-1
dw 0
db 0
db 0x89
db 0
db 0
dq 0
Tss:
dd 0
dq 0xffff800000190000
times 88 db 0
dd TssLen
TssLen: equ $-Tss
моя попытка перевести на газ:
TssDesc:
.word TssLen-1
.word 0
.byte 0
.byte 0x89
.byte 0
.byte 0
.quad 0
Tss:
.long 0
.quad 0xffff800000190000
.fill 88,8,0
.long TssLen
TssEnd:
.set TssLen, TssEnd - Tss
Правильно ли это?
И можно ли использовать TssLen(.длинный TssLen) перед .set(.set TssLen, TssEnd — Tss)?
Комментарии:
1.
.fill 88,8,0
это неправильно. Обратите внимание, что оригинал имеетdb
. Так что это просто.fill 88
.2. Стиль кодирования: я бы предпочел использовать
.equ
для определения целочисленных констант илиTssLen = . - Tss
, по аналогии сequ
ключевым словом NASM..set
это синоним в GAS, но я предпочитаю не использовать его для определенных констант времени сборки, которые я на самом деле не хочу или не хочу видеть в таблице символов в .o.3. Но если я напишу .equ TssLen = . — Tss, это выдаст мне ошибку boot64.S:25: Ошибка: ожидаемая запятая после «TssLen».