|
|||||||
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 |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|