Четвертая лекция
Самая простая программа
.model tiny
.code
org 100h
start:
ret
end start
Не делает ничего)
2 шага:
- тексты превращаются в модули
- модули собираются в исходник
Hello, World!
Создадим файл “1.s”
#Это для 32-битных систем
.globl _start #Можно .global(без разницы)
.text
# комментарий через #
# абсолютные значения(чиселки) через $
# Регистры через %
_start:
mov $4, %eax #функция write имеет опкод 4
mov $1, %ebx
mov %messg, %ecx
mov %lmessg, %edx
int %0x80
mov $1, %eax #код
xor %ebx, %ebx #завер-
int $0x80 #шения
.data
messg: .ascii "Hello, World!\n"
#.byte 10 - Можно юзать вместо переноса строки (сам переведёт строку дважды)
lmessg = . - messg #вычисляет разницу между указателем на .data и указателем на messg (т.е. длину строки)
ARWX - (A - allocated, R - readable, W - writable, X executable)
К функциям ОСи можно обращаться int 0x80
(для всех) и syscall
для 64-битных систем
syscall намного быстрее, но “портятся” регистры
Узнать параметры можно с помощью man
, например man exit
Параметр syscall берётся из регистра eax и результат кладётся туда же
as -o 1.o 1.s //команда трансляции из 1.s в 1.o
ld -o 1 1.o //команда компоновки 1.o
./1 //команда запуска
Перепишем программу для 64-битной системы (с использованием syscall)
#Это для 64-битных систем
.globl _start
.text
_start:
mov $1, %eax
mov $1, %edi
mov %messg, %esi
mov %lmessg, %edx
syscall
mov $60, %eax
# xor %ebx, %ebx
mov $37, %edi
int $0x80
.data
messg: .ascii "Hello, World!"
.byte 10
lmessg = . - messg
Программа для сборки компилятором C
Для простоты назовём 2.s
Просто заменяем _start на main, добпаляем в первую строку push %rbp
, в последнюю и всё работает:)
#Это для 64-битных систем
.globl main
.text
main:
push %rbp
mov $1, %eax
mov $1, %edi
mov %messg, %esi
mov %lmessg, %edx
syscall
pop %rbp
ret
.data
messg: .ascii "Hello, World!"
.byte 10
lmessg = . - messg
Компиляция и запуск сишным компилером:
gcc -o 2 2.s
./2