MyTetra Share
Делитесь знаниями!
Nasm в Linux на примере программы, делающей системный вызов через int 80h
Время создания: 21.01.2012 01:57
Текстовые метки: nasm, linux, ассемблер, assembler, системный вызов, sys, system, call, int 80h, пример
Раздел: Компьютер - Linux - Ассемблер
Запись: xintrea/mytetra_syncro/master/base/1327100246iobxkj21gg/text.html на raw.github.com

Пример работы с системным вызовом


Вот пример очень простой программы, которая ничего не делает и просто завершается с кодом выхода 2. Для выхода используется вызов системной функции (syscall) через прерывание int 80H.


Примечание. Следует учитывать, что в Linux есть и другие механизмы вызова системной функции - через ассемблерные инструкции sysenter/sysexit, через инструкции syscall/sysret которые разработаны в AMD для x32 и x64 архитектуры, но не приняты в Intel, через подсистему vsyscall (устарело), и через механизм vDSO (Virtual Dynamic Shared Object). Каждый более новый механизм вызова системной функции работает быстре чем устаревший. Например, скорость вызова через int 80H на i7-5500U (2.5GHz) будет примерно 500нс, а через механизм vDSO около 50нс. Разница в 10 раз, и этот факт может существенно влиять на производительность, если системный вызов происходит в цикле.


Эта простая программа показывает базовую структуру текста программы на ассемблере NASM:



; Начало текстового сегмента

section .text


global _start


; Точка входа в программу

_start:


; Передача кода системного вызова (для sys_exit это код 1)

mov eax, 1


; Значение, которое будет возвращать системный вызов sys_exit при выходе

mov ebx, 2


; Вызов ОС

int 80h



Сборка примера


Трансляция NASM в объектный файл:



nasm -f elf -o program.o program.asm



Компоновка:



ld -o program program.o



Компоновка при использовании внешней библиотеки C (линковка с динамической библиотекой):



ld -dynamic-linker /lib/ld-linux.so.2 -lc -o program program.o



Пример вывода строки на экран (Hello Word)


Вот пример классического Hello Word на Ассемблере NASM:



section .text

global _start


_start:


mov edx,len ; В EDX помещается длина строки

mov ecx,msg ; В ECX записывается адрес начала строки

mov ebx,1 ; В EBX помещается дескриптор файла (для stdout он всегда равен 1)

mov eax,4 ; В EAX помещается system call number 4 (sys_write)

int 0x80 ; Вызов функции ядра


mov eax,1 ; В EAX помещается system call number 1 (sys_exit)

int 0x80 ; Вызов функции ядра


section .data


msg db 'Hello, world!',0xa

len equ $ - msg



Компиляция:



nasm -f elf main.s -o main32.o

ld -melf_i386 main32.o -o a32.out


Или в расширенном режиме (программа будет работать, так как компилируется статически)


nasm -f elf64 main.s -o main.o

ld main.o -o a.out


 
MyTetra Share v.0.59
Яндекс индекс цитирования