Skip to main content

የመስመር ውስጥ ስብሰባ

መግቢያ

የWave የመስመር ላይ ስብሰባ የተፃፈው ከasm { ... } ብሎክ ነው። በእርስዎ Wave ኮድ ውስጥ መዝገቦችን፣ ማህደረ ትውስታን እና የስርዓት ጥሪ መንገዶችን በቀጥታ መቆጣጠር ይችላሉ።

አሁን ያሉ የድጋፍ ግቦች፡-

  • Linux x86_64
  • Linux aarch64
  • macOS (Darwin) arm64
  • freestanding x86_64
  • freestanding aarch64
  • freestanding riscv64

Windows እና 32-ቢት ኢላማዎች ገና አልተደገፉም።


መሰረታዊ ቅፅ

asm እንደ መግለጫ ወይም መግለጫ ሆኖ ሊያገለግል ይችላል።

asm {
"instruction"
in("constraint_or_reg") value
out("constraint_or_reg") target
clobber("item")
}

አካላት፡-

  • የሕብረቁምፊ መስመር፡ ትክክለኛው የመሰብሰቢያ መመሪያ
  • in(...)፡ የግቤት ኦፕሬተር
  • out(...)፡ የውጤት ኦፕሬተር
  • clobber(...)፡ ይመዝገቡ/ግዛት/የማስታወሻ ፍንጭ ተደምስሷል

asm መግለጫ

የመመለሻ ዋጋ የማያስፈልግ ከሆነ እንደ መደበኛ መግለጫ ይጠቀሙበት።

var ret: i64 = 0;
asm {
"mov rax, 1"
"syscall"
in("rdi") 1
in("rsi") msg_ptr
in("rdx") 20
out("rax") ret
}

ብዙ out(...) ሊኖርዎት ይችላል።


asm አገላለጽ

እሴቱን በቀጥታ በመፍጠር ሊጠቀሙበት ይችላሉ.

var result: i64 = asm {
"mov rax, 123"
out("rax") result
};

ማስታወሻ፡-

  • asm የሚለው አገላለጽ ** በትክክል አንድ out(...)** ይፈቅዳል።

in(...) / out(...) ፋርማሲዩቲካል

in("...")out("...") ሕብረቁምፊ ከሚከተሉት ውስጥ አንዱ ነው።

  1. የኮንክሪት መዝገብ
  • ምሳሌ፡ "rax""rdi""x0""w1""a0""t0"
  1. ገደብ ክፍል
  • ምሳሌ፡ "r""m""rm"

ምሳሌ፡-

in("r") &buf
out("rax") ret

ለውጤት ዒላማ (out(...) target)፣ አሁን ባለው ትግበራ ላይ በመመስረት የሚከተለው ንድፍ ይመከራል።

  • ተለዋዋጭ፡
  • የጠቋሚ ማጣቀሻ፡ out("rax") deref p

clobber(...)

clobber(...) ብዙ እቃዎችን በአንድ ጊዜ መቀበል ይችላል እና ብዙ ጊዜ ጥቅም ላይ ሊውል ይችላል።

asm {
"xor rax, rax"
clobber("rax")
clobber("rcx", "rdx")
clobber("memory")
}

ዋና እቃዎች፡-

  • ተመዝጋቢዎች፡ "rax""x0"፣ ወዘተ
  • ልዩ፡ "memory""cc" (ውስጣዊ መደበኛነት በአንድ ዒላማ)

አቀናባሪው በራስ ሰር ነባሪ ክሎበርን በወግ አጥባቂ ደህንነቱ ሁኔታ ያክላል። (memory፣ ባንዲራዎች/ሲሲ ተከታታዮች፣ወዘተ፤ በዋናነት memory በ RISC-V ነፃ አቋም)


የኦፔራ ቦታ ያዥ ($0$1፣ ...)

በትእዛዝ ሕብረቁምፊ ውስጥ ኦፔራዶችን ሲያመለክቱ $N ይጠቀሙ።

asm {
"mov QWORD PTR [$0], 777"
in("r") &buf
clobber("memory")
}

ማስታወሻ፡-

  • %0 ዘይቤን ብትጠቀምም ከውስጥ ወደ $0 ዘይቤ ተቀይሯል።

የግቤት ኦፔራ የአሁኑ የሚደገፍ ክልል

in(...) እሴት በአሁኑ ጊዜ የሚከተሉትን ቅጾች ይደግፋል፡

  • ተለዋዋጭ መለያ
  • ኢንቲጀር ቀጥተኛ
  • ሕብረቁምፊ ቃል በቃል
  • &identifier
  • deref identifier
  • አሉታዊ ኢንቲጀር/እውነተኛ ቃል በቃል

ውስብስብ መደበኛ መግለጫዎች የተገደቡ ሊሆኑ ይችላሉ, ስለዚህ አስፈላጊ ሆኖ ሲገኝ ንድፉን በጊዜያዊ ተለዋዋጭ ውስጥ እንዲያልፉ እንመክራለን.


ጥንቃቄዎች

የውስጠ-መስመር ስብሰባ የስርዓቱን አይነት ጥበቃዎች በከፊል ያልፋል። የተሳሳቱ የመመዝገቢያ ዝርዝሮች፣ የግጭት ግጭቶች ወይም የጎደሉ ክሎበርስ የተሳሳተ የኮድ ማመንጨት ወይም የአሂድ ጊዜ ብልሽቶችን ሊያስከትሉ ይችላሉ።

ምክሮች፡-

  • መጀመሪያ ኢላማውን ABI እና የጥሪ ፕሮቶኮልን ያረጋግጡ
  • የግቤት/ውጤት መዝገቦችን እና ክሎበርን በግልፅ ያስተዳድሩ
  • ማህደረ ትውስታ በቀጥታ ከተነካ clobber("memory") እንዲሁ ታውጇል።