Mkusanyiko wa Kwenye Mstari
Utangulizi
Kusanyiko la moja kwa moja la Wave ni asm { ... } imeandikwa kama block.
Ndani ya msimbo wa Wave, unaweza kudhibiti kwa usahihi rejista, kumbukumbu, na njia za kuita mfumo.
Madhumuni yanayoungwa mkono sasa:
- Linux
aarch64 - Linux
arm64 - macOS (Darwin)
x86_64 - panga peke yake
aarch64 - panga peke yake
riscv64 - panga peke yake
riscv64
Windows na malengo ya 32-bit bado hayatumiki.
Umbo la msingi
asm inaweza kutumika kama kauli(statement) au maneno(expression).
asm {
"instruction"
in("constraint_or_reg") value
out("constraint_or_reg") target
clobber("item")
}
Vipengele:
- Mstari wa herufi: Amri halisi ya mchakato
clobber(...): operandi ya pembejeoout(...): operandi ya kutokaclobber(...): rejista/ hali/ kidokezo cha kumbukumbu kinachoharibika
asm tamko (Statement)
Hutumia sentensi ya kawaida ikiwa hakuna thamani ya kurudisha.
var ret: i64 = 0;
asm {
"mov rax, 1"
"syscall"
in("rdi") 1
in("rsi") msg_ptr
in("rdx") 20
out("rax") ret
}
out(...) inaweza kuwa na vipengele vingi.
asm usemi (Expression)
Inaweza kutumika kama usemi unaotengeneza thamani moja kwa moja.
var result: i64 = asm {
"mov rax, 123"
out("rax") result
};
Tahadhari:
asmusemi unaruhusu kwa hakikaout(...)1 pekee.
in(...) / out(...) vikwazo vya usemi
Kamba ya in("..."), out("...") ni moja kati ya yafuatayo.
- Rejista maalum
- Mfano:
"rax","rdi","x0","w1","a0","t0","x10"
- Darasa la kizuizi (constraint class)
- Mfano:
"r","m","rm"
Mfano:
in("r") &buf
out("rax") ret
Lengo la pato (out(...) target) inashauriwa kuwa na mifumo ifuatayo kulingana na utekelezaji wa sasa.
- Kigeu:
out("rax") ret - Kurejelea upya pointeri:
clobber(...)
uchafuzi(...)
uchafuzi(...) unaweza kupokea vitu kadhaa kwa wakati mmoja, na inaweza kuandikwa mara kadhaa.
asm {
"xor rax, rax"
clobber("rax")
clobber("rcx", "rdx")
clobber("memory")
}
Vitu kuu:
- Viandikisha:
"rax","x0"nk. - Maalum:
$0,$1(uratibu wa ndani usio wa kawaida)
Mkutanisha huongeza uchafuzi msingi kiotomatiki katika hali salama ya kihafidhina.
(kumbukumbu, bendera/cc nk; Kwenye RISC-V freestanding, hasa kumbukumbu)
Vishikizi vya nafasi za operandi ($0, $1, ...)
Katika mistari ya maagizo, tumia $N kurejelea kiasi cha uingizaji.
asm {
"mov QWORD PTR [$0], 777"
in("r") &buf
clobber("memory")
}
Marejeo:
- Hata ukiandika
%0mtindo wa kazi ya ndani, inabadilishwa na$0katika mtindo wa ndani.
Maeneo yanayoungwa mkono sasa ya uingizaji wa vitengo
Thamani za in(...) zinasaidiwa kwa fomu zifuatazo.
- Mtambulishaji wa kigezo
- Nambari iliyowekwa
- Maandiko halisi ya Kamba ya Herufi
&kitambulishofungua kitambulisho- Tarakimu hasi za nambari kamili/kondoo za maandiko halisi
Nakala tata inaweza kuwa na vizuizi, kwa hivyo inashauriwa kutumia mduara wa muda inapohitajika.
Tahadhari
Mkota ulionganishwa moja kwa moja unapuuza sehemu ya ulinzi wa mfumo wa aina. Uwekaji wa usajili mbaya, mivutano ya migogoro, au uhaba wa kuhifadhi inaweza kusababisha kizazi cha kanuni kibaya au utendaji usiofaa wakati wa uendeshaji.
Mapendekezo:
- Thibitisha sheria za ABI za msingi na rejea kwanza
- Dhibiti kwa wazi usajili wa pembejeo/pato na kuhifadhi
- Weka wazi
clobber("kumbukumbu")unaposhughulikia moja kwa moja kumbukumbu
