| składnia Intel'a | składnia AT&T | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| przykładowy program |
global main
|
.section .rodata
|
||||||||
| pisownia rejestrów |
|
|
||||||||
| pisownia liczb |
|
|
||||||||
| menmoniki |
* kolejność argumentów: cel, źródło * dyrektywy odwołań do pamięci mówiące o przekazywanej wielkości mov eax, 1b
|
* kolejność argumrentów: żródło, cel * sufiksy operatorów oznaczające wielkość przekazwaną movl $1, eax
|
||||||||
| odwołania do pamięci |
podawane w '[' i ']' mov eax,[ebx+10h]
|
odwołanie w '(' i ')' movl 0x10(%ebx),%eax
wymyślna forma zapisu operacji kompleksowych!!! |
| Intel | AT&T |
|---|---|
mov eax, [ebx + ecx*2 + 3] |
movl 3(%ebx, %ecx, 2), %eax |
copy_to_user
Interesujące nas pliki:
copy_to_user:makro copy_to_user z pliku aucces.h |
|---|
|
constant lub generic. Oba sprawdzają uprawnienia do
wykonania operacji a następnie wywołują odpowiednio makra __constant_copy_user
i __generic_copy_user. Definicję pierwszego z nich mozemy znaleźć w pliku
uaccess.h, oto jej fragment:makro __constant_copy_user z pliku aucces.h |
|---|
|
__generic_copy_user, które zdefiniowane zostało w pliku usercopy.c:makro __generic_copy_user z pliku usercopy.c |
|---|
|
CONFIG_X86_USE_3DNOW_AND_WORKS wywołuje się albo wersja makra
__generic_copy_user dająca ew. możliwość wykorzystania rozkazów MMX procesora.
Albo wersja druga, która korzysta ze zdefiniowanego w pliku uaccess.h makra
(__copy_user):makro __copy_user z pliku uaccess.h |
|---|
|
CONFIG_X86_USE_3DNOW_AND_WORKS
nigdy nie zostaje spełniony! Innymi słowy makro takie nie zostało dotąd zaimplementowane.
Nic nie stoi na przeszkodzie, by czytelnik zrobił to samodzielnie.makro fast_clear_page z pliku mmx.c |
|---|
|
mm0. Rejestr ten
jest dodatkowym rejestrem występującym w procesorach z obsługą MMX. Warto zwrócić
tu uwagę na to, że zwiększenie rozmiaru kodu pozwala na zmniejszenie ilości
poleceń zwiększenia licznika co ma znaczenie przy tak często wywoływanej operacji.