LINUX.ORG.RU

Ответ на: комментарий от SZT

там я хелловорлд на ассемблерных вставках делал, в качестве примера вполне подойдет

А почему там такой синтаксис страшный, что каждую строку с ассемблером в кавычки пихать?

А ещё syscall — почему не int 80h?

Кстати, а что лучше, gas или fasm по-твоему?

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

Тут, вероятно, больше вопрос синтаксиса - AT&T vs Intel. Я, например, не перевариваю AT&T. И да, у fasm на порядок круче язык макросов.

На 64-битной системе используется только syscall, ибо быстрее. На 32-битной тоже имеет смысл его использовать для скорости.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)

Какой смысл ассемблерных вставок, интересно мне. Напиши отдельно функцию на ассемблере и дёргай её там где тебе нужна вставка. По-моему пролог не сложно и ручками написать.

invy ★★★★★
()
Ответ на: комментарий от Xenius

А почему там такой синтаксис страшный, что каждую строку с ассемблером в кавычки пихать?

Потому что так устроены ассемблерные вставки в GCC

Кстати, а что лучше, gas или fasm по-твоему?

GAS поддерживает больше, им можно под ARM, MIPS и под кучу других архитектур программировать, FASM же умеет только в x86 и x86-64, насколько я знаю. С этой точки зрения, GAS предпочтительней. Насчет макросов, я FASM не использовал и насчет его макроязыка ничего сказать не могу. В любом случае, встраивать куски, написанные на FASM непосредственно в код C/C++ для GCC не выйдет, там только GAS можно. Но можно написать библиотеку на FASM и линковать ее

SZT ★★★★★
()
Ответ на: комментарий от invy

В fasm его даже может написать за тебя макрос. Причём с поддержкой локальных переменных, аргументов и выбором соглашения вызова.

KivApple ★★★★★
()
Ответ на: комментарий от invy

Напиши отдельно функцию на ассемблере и дёргай её там где тебе нужна вставка

Это тогда будет уже вызов функции, непосредственного встраивания в код так сделать не получится.

SZT ★★★★★
()
Ответ на: комментарий от invy

Какой смысл ассемблерных вставок, интересно мне.

Потому что можно сделать static inline. Потому что можно использовать переменные на стеке без плясок с бубном. Потому что компилятор может оптимизировать использование регистров.

AptGet ★★★
()
Ответ на: комментарий от Xenius

А ещё syscall — почему не int 80h?

потому что syscall быстрее, и это стандартный способ использования системных вызовов. Посмотри на выхлоп gcc.

anonymous
()
Ответ на: комментарий от KivApple

Тут, вероятно, больше вопрос синтаксиса - AT&T vs Intel. Я, например, не перевариваю AT&T. И да, у fasm на порядок круче язык макросов.

gas умеет сишные макросы.

anonymous
()
Ответ на: комментарий от KivApple

На 64-битной системе используется только syscall, ибо быстрее. На 32-битной тоже имеет смысл его использовать для скорости.

Intelовские процессоры не поддерживают инструкцию syscall в 32-битном режиме.

Relan ★★★★★
()
Ответ на: комментарий от invy

Какой смысл ассемблерных вставок, интересно мне. Напиши отдельно функцию на ассемблере и дёргай её там где тебе нужна вставка.

И огреби проблем с раскруткой стека.

Relan ★★★★★
()
Ответ на: комментарий от Relan

Intelовские процессоры не поддерживают инструкцию syscall в 32-битном режиме.

схренабы, если syscall появился задолго до amd64?

anonymous
()
Ответ на: комментарий от Relan
~> uname -p
Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
~> uname -m
x86_64
~> cat hw.s
.data
msg: .ascii "Hello,world!\n"
len = . - msg
.text
.globl _start
_start:
movl $4,%eax
movl $1,%ebx
movl $msg,%ecx
movl $len,%edx
syscall
xorl %ebx,%ebx
movl $1,%eax
syscall
~> as -o hw.o hw.s --32
~> ld -melf_i386 -o hw hw.o
~> file hw
hw: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
~> ./hw
Hello,world!
~>
anonymous
()
Ответ на: комментарий от anonymous

смануала

пруф.

Так и быть, у меня сегодня толерантное настроение. Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 2, SYSCALL—Fast System Call:

Operation
IF (CS.L ≠ 1) or (IA32_EFER.LMA ≠ 1) or (IA32_EFER.SCE ≠ 1)
(* Not in 64-Bit Mode or SYSCALL/SYSRET not enabled in IA32_EFER *)
    THEN #UD;
FI;
Relan ★★★★★
()
Ответ на: комментарий от anonymous

См. syscall_init() в ядре, она инициализирует MSRы для поддержки syscall. Всё это делается только в 64-битном ядре (под CONFIG_X86_64).

Relan ★★★★★
()

Не надо делать вставки. Надо делать отдельные файлы *.S

anonymous
()
Ответ на: комментарий от anonymous

gas умеет сишные макросы.

4.2

*.S принято прогонять через CPP. gcc делает это.

anonymous
()
Ответ на: комментарий от Relan

Если выставить IA32_EFER.LMA, то это уже не 32-битный режим процессора.

во время выполнения 32-битных бинарников LMA==0, так что это 32-битный режим.

P.S. EFER и syscall были запилены вместе с K6, и для использования syscall нужно было тот самый бит SCE в EFER выставить. Это можно делать и в 32-битном режиме.

anonymous
()
Ответ на: комментарий от buddhist

Под x86 лучше fasm. Но gas дефолтнее и линуксовее. Еще yasm ничего.

Есть fasm же и для ARM

А Yasm — это какая-то мутная попытка переписать NASM вроде... лучше бы их слили...

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от anonymous

А что такое syscall, новая инструкция? А в каком процессоре она появилась? Я думал, это макрос, подставляющий int 80h. Какой у него опкод, не CD80?

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

http://download.intel.com/products/processor/manual/325462.pdf

SYSCALL invokes an OS system-call handler at privilege level 0. It does so by loading RIP from the IA32_LSTAR MSR (after saving the address of the instruction following SYSCALL into RCX). (The WRMSR instruction ensures that the IA32_LSTAR MSR always contain a canonical address.) SYSCALL also saves RFLAGS into R11 and then masks RFLAGS using the IA32_FMASK MSR (MSR address C0000084H); specifically, the processor clears in RFLAGS every bit corresponding to a bit that is set in the IA32_FMASK MSR.

SYSCALL loads the CS and SS selectors with values derived from bits 47:32 of the IA32_STAR MSR. However, the CS and SS descriptor caches are not loaded from the descriptors (in GDT or LDT) referenced by those selectors. Instead, the descriptor caches are loaded with fixed values. See the Operation section for details. It is the respon- sibility of OS software to ensure that the descriptors (in GDT or LDT) referenced by those selector values corre- spond to the fixed values loaded into the descriptor caches; the SYSCALL instruction does not ensure this correspondence.

The SYSCALL instruction does not save the stack pointer (RSP). If the OS system-call handler will change the stack pointer, it is the responsibility of software to save the previous value of the stack pointer. This might be done prior to executing SYSCALL, with software restoring the stack pointer with the instruction following SYSCALL (which will be executed after SYSRET). Alternatively, the OS system-call handler may save the stack pointer and restore it before executing SYSRET.

anonymous
()
Ответ на: комментарий от anonymous

во время выполнения 32-битных бинарников LMA==0, так что это 32-битный режим

Нет.

EFER и syscall были запилены вместе с K6, и для использования syscall нужно было тот самый бит SCE в EFER выставить. Это можно делать и в 32-битном режиме.

Это да. Но речь была про Intel.

Relan ★★★★★
()
Ответ на: комментарий от Relan

Это да. Но речь была про Intel.

ты хочешь сказать, что интел криво реализует чужие спеки больше одного раза? (/me вспомнил дыру sysret). В любом случае похер, и никто не мешает юзать sysenter вместо syscall, из юзерспейса разницы нет, разве что регистры самому надо сохранить.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.