В случае, если вы просто хотите выполнить простое программирование на ассемблере на своем P C, на самом деле вам не нужен 16-битный код и вы не хотите погружаться в загрузчики и разработку ОС, вы можете начать работу намного легче, написание 32-битного (IA32) или 64-битного (AMD64) кода приложения. Вместо прерываний B IOS вы будете использовать (Linux) системные вызовы .
Примером "hello world" для i386 будет:
.section .text._start
.global _start
.type _start, %function
_start:
mov $4, %eax
mov $1, %ebx
mov $message, %ecx
mov $14, %edx
int $0x80
mov $1, %eax
xor %ebx, %ebx
int $0x80
.section .rodata.message
.type message, %object
message:
.ascii "Hello, World!\n"
Сборка, связывание и выполнение через
as --32 test32.S -o test32.o && ld -m elf_i386 test32.o -o test32 && ./test32
То же самое для AMD64:
.section .text._start
.global _start
.type _start, %function
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $14, %rdx
syscall
mov $0x3c, %rax
xor %rdi, %rdi
syscall
.section .rodata.message
.type message, %object
message:
.ascii "Hello, World!\n"
Сборка, связывание и выполнение через
as --64 test64.S -o test64.o && ld -m elf_x86_64 test64.o -o test64 && ./test64
Просто для удовольствия то же самое для ARM (32 бита):
.syntax unified
.arch armv6
.arm
.section .text._start
.global _start
.type _start, %function
_start:
movs r7, #4
movs r0, #1
ldr r1, =#message
movs r2, #14
svc #0
movs r7, #1
movs r0, #0
svc #0
.ltorg
.section .rodata.message
.type message, %object
message:
.ascii "Hello, World!\n"
Собрать, связать и выполнить через (например, на Raspberry PI или Beaglebone):
as testarm.S -o testarm.o && ld testarm.o -o testarm && ./testarm