Как перевести этот код с синтаксиса Intel (nasm) на AT

#assembly #nasm #att

#сборка #nasm #att

Вопрос:

 gdt64:
  dq 0 ; zero entry
.code: equ $ - gdt64
  ; 0x08 kernel CS 0x8
  ; bits set: descriptor type, present, executable, 64bit
  dq (1<<53) | (1<<47) |                     (1<<44) | (1<<43) ; kernel
  ; 0x10 user CS
  ; works when its set to kernel mode, but when in user mode, it doesnt, duh
  ;dq (1<<53) | (1<<47) |                     (1<<44) | (1<<43) ; kernel
  dq (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43)
 

Я понимаю, что dq — это .long . И я могу перевести первую часть этого:

 gdt64:
  .long 0 // zero entry
.code = . - gdt64
 

Но как перевести такую строку, как эта:

   dq (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43)
 

Комментарии:

1. Не специалист по сборке, но разве это не было бы просто числом с установленными соответствующими битами?

2. Вы пробовали .quad (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43) ?

3. Да, я думаю, что это число с соответствующим набором битов.

Ответ №1:

Прежде всего, dq в NASM выполняется сборка 8-байтового четырехслова, тогда .long как в x86 GAS — это 4-байтовое двойное слово, так что это не то, что вы хотите. Правильный эквивалент таков .quad .

Your (1<<53) | ... — это просто арифметическое выражение, использующее C-подобные операторы сдвига и побитовые операторы, и dq (1 << 53) | ... собирает четырехсловие, имеющее в качестве своего значения результат этого выражения. GAS также принимает этот синтаксис, поэтому вы можете просто написать

 .quad (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43)