|
.data
msg:
    .ascii "Hello, world!"
len = . - msg
.text
.global _start
_start:
movl $len,%edx
movl $msg,%ecx
movl $1,%ebx
movl $4,%еах
int $0x80
movl $0,%ebx
movl $1,%еах
int $0x80
|
# секция данных
# наша строка
# ее длина
# начало секции кода
# метка „start — точка входа,
# то есть
# начало программы для компоновщика
# выводим строку на s t d o u t:
# третий аргумент - длина строки
# второй - указатель на строку
# первый - дескриптор файла STDOUT - 1
# номер системного вызова 'write'
# вызываем ядро
# завершаем работу:
# помещаем код возврата в ЕВХ
# номер системного вызова 'exit' в ЕАХ
# и снова вызываем ядро
|
Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.
Компилируем так
as -o helloworld.o helloworld.s
ld -s -o helloworld helloworld.o
скачать архив с исходным кодом и исполняемым файлом этого примера
tar.gz
zip
Как видите здесь используется ядро линукс, вызов к функциям которого осуществляется
через прерывание 80h , а параметры передаются через регистры.
Для вызова фнуций ядра Linux надо :
- поместить в регистр еах номер системного вызова
- поместить в регистры ebx,ecx,edx,esi,edi параметры системного вызова, в ebx - первый, в ecx - второй
и в edx - третий и т.д.
если параметров 6 и больше, то в еах также номер системного вызова, а параметры в памяти подряд,
адрес первого параметра в регистр ebp
- вызвать прерывание 80h
В данной программе мы используем 2 системных вызова - SYS_write и SYS_exit, в системном вызове
write передаются 3 параметра :
-
Дескриптор файла в который производится запись(вывод),
в нашем случае мы помещаем стандартный дескриптор для вывода на экран,
1- всегда дескриптор STDOUT,еще в Linux всегда доступну STDIN - ввод с клавиатуры (дескриптор=0) и
STDERR - вывод ошибок (дескриптор=3), но также в нашей программе ничего не мешает нам открыть какой-нибудь
файл, и указать в вызове его дескриптор, просто тогда наша строка будет не на экран
выведена, а записана в открытый нами файл.
- Адрес строки, которую будем выводить/записывать
- размер строки, которую выводим/записываем
В системном вызове Exit параметр только один, и он определяет код возвращаемый вызовом,
так как в нашем случае нам ничего не нужно возвращать, этот параметр у нас равен 0.
С уважением Pauk_pv
|