Какие директивы я должен использовать в ГАЗЕ? Я нашел директиву .org, но GAS, похоже, не имеет директивы .bits.
По умолчанию ассемблер 64-битный, вы можете использовать --32
или --64
для выбора в командной строке. Взгляните на руководство для как , чтобы увидеть, как вы можете изменить архитектуру внутри кода, если это необходимо (например, .code16
можно использовать для генерации кода реального режима для загрузчика).
Скорее всего, вы не хотите использовать директиву .org
, чтобы указать, где находится код, но, вероятно, захотите использовать скрипт ссылки или указать, где сегменты текста и данных загружаются в командной строке. (org 0x0000000000200000
приводит к двоичному файлу размером более 2 МБ).
Что я должен передать gcc или как создать простой двоичный файл? То есть что опция -f bin делает с NASM.
$ cat test.S
.section .text
.globl _start
_start:
xor %rax, %rax
mov test, %rax
ret
test: .quad 0x1234567812345678
$ as --64 -o test.o test.S
$ ld -Ttext 200000 --oformat binary -o test.bin test.o
$ objdump -D -b binary -m i386:x86-64 test.bin
test.bin: file format binary
Disassembly of section .data:</p>
<p>0000000000000000 <.data>:
0: 48 31 c0 xor %rax,%rax
3: 48 8b 04 25 0c 00 20 mov 0x20000c,%rax
a: 00
b: c3 retq<br>
c: 78 56 js 0x64
e: 34 12 xor $0x12,%al
10: 78 56 js 0x68
12: 34 12 xor $0x12,%al