Skip to content

Binary translator from binary code for virtual processor to x86

License

Notifications You must be signed in to change notification settings

RustamSubkhankulov/binary-translator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

JIT-компилятор

JIT-компилятор, Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для исполнСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ процСссором, Π² инструкции Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ процСссор Π±Ρ‹Π» написан Π² качСствС ΡƒΡ‡Π΅Π±Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ сСмСстрС (МЀВИ ЀРКВ)

Главная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ JIT (Just-in-time) компилятора состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ трансляции - Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, содСрТащий инструкции Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ происходит трансляция, исполняСтся сразу ΠΆΠ΅ послС процСсса трансляции. Для этого Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ сохраняСтся Π² массивС ΠΈ вызываСтся Π² качСствС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π“Π»Π°Π²Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ написании JIT-компилятора, это ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ быстродСйствия исполнСния. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния тСстовой Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

АрхитСктура Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌΠΈ Π² обсуТдСниях трансляции, Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ происходит трансляция, r86.

Для Π½Π°Ρ‡Π°Π»Π° опишСм инструкции Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ r86.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ r86 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄Π΅Π»Π΅Π½Ρ‹ Π½Π° нСсколько Π³Ρ€ΡƒΠΏΠΏ:

  1. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: эта Π³Ρ€ΡƒΠΏΠΏΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΊΠ°ΠΊ инструкции, производящиС ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ - ADD, SUB, MUL, DIV, Ρ‚Π°ΠΊ ΠΈ инструкции, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠ΅ значСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… матСматчиских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ - SIN, COS, TG, LN, ASIN, ATG, POW - ΠΈ инструкции сравнСния - MR, MRE, LS, LSE, EQ, NEQ.
  2. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ исполнСния - бСзусловный 'jump' - JMP, условныС 'jump'Ρ‹ - JA, JAE, JB, JBE, JE, JNE, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CALL, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RET ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСссора HLT.
  3. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ… - PUSH ΠΈ POP
  4. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° IN ΠΈ OUT

НСобходимыми для исполнСния инструкций Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ процСссоров ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

  • 16 рСгистров ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния, содСрТащиС Π² сСбС значСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float)
  • ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 1024 элСмСнта, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΈΠ· сСбя массив Ρ‚ΠΈΠΏΠ° float
  • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… стСк, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉΡΡ для Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ, построСнной Π½Π° PUSH ΠΈ POP инструкциях, Π° Ρ‚Π°ΠΊΠΆΠ΅ для хранСния адрСса Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

АрифмСтика

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ r86 - всС инструкции, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ для вычислСния арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ со стСка. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ инструкции, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для вычислСний Π΄Π²Π° значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сСйчас находятся Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. ПослС выполнСния инструкции Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ находится Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка.

ADD, SUB, MUL ΠΈ DIV ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ арифмСтичСскиС дСйствия - слоТСниС, Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ этом Ссли Π΄ΠΎ выполнСния инстукции Π² стСкС Π»Π΅ΠΆΠ°Π»ΠΎ Π΄Π²Π° числа - Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ‚ΠΎ послС Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ SIN, COS, TG, LN, ASIN, ATG Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ соотвСтсвСнно синус, косинус, тангСнс, Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ, арктангСнс ΠΈ арксинус ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка ΠΈ Ρ‚Π°ΠΌ ΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ЀактичСски, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, находящийся Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка, замСняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ примСнСния ΠΊ Π½Π΅ΠΌΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для вычислСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π±ΠΈΠ±Π»Π΅ΠΎΡ‚Π΅ΠΊΠΈ <math.h>.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ MR, MRE, LS, LSE, EQ, NEQ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ Π΄Π²Π° значСния, находящиСся Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ΠΈ Π² зависимости ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈΠ»ΠΈ ноль Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. Если сравнСниС Π²Π΅Ρ€Π½ΠΎ, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ являСтся 1, ΠΈΠ½Π°Ρ‡Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π²Π΅Π½ 0. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния инструкции сравнСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· стСка.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ HLT являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ условиСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ процСссор встрСчаСт ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ HLT, Π²Π½Π΅ зависимости ΠΎΡ‚ состояния стСка исполнСниС Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… инструкций прСкращаСтся.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CALL сохраняСт адрСс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ послС Π½Π΅Π΅ инструкции Π² стСкС, Π° послС этого исполнСниС инструкций продолТаСтся с адрСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ инструкции CALL Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ RET ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка, послС Ρ‡Π΅Π³ΠΎ исполнСниС инструкций происходит с адрСса, Ρ€Π°Π²Π½ΠΎΠ³ΠΎ этому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΡƒΡ… этих инструкций происходят Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Π½Π΅Π΅ Π² r86 Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅.

БСзусловный 'jump' Π²Π½Π΅ зависимости ΠΎΡ‚ состояния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора измСняСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² ΠΊΠΎΠ΄Π΅, инструкции ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ исполнятся с адрСса, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ инструкции Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ бСзусловного, условныС 'jump'Ρ‹ происходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сравнСния Π΄Π²ΡƒΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² - Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка - являСтся true. Π˜Π½Π°Ρ‡Π΅ ΠΏΡ€Ρ‹ΠΆΠΎΠΊ Π½Π΅ происходит ΠΈ исполнСниС инструкций продолТаСтся со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ послС условного 'jump'Π°. ΠŸΡ€ΠΈ сравнСнии Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΈΠ· стСка.

АргумСнтами условного ΠΈ бСзусловных 'jump'ΠΎΠ² являтся Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ адрСса - ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Ρ‡Π°Π»Π°.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

Для пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ инструкции - PUSH ΠΈ POP. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ r86 отсутствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСгистра ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² рСгистр ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±Π΅Π· использования стСка.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ PUSH добавляСт значСния Π² стСк, Π° POP - удаляСт Π΅Π³ΠΎ ΠΈΠ· стСка.

Π’ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ r86 ΡΡƒΡ‰Π΅ΡΠ²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ разновидности Π΄Π°Π½Π½Ρ‹Ρ… инструкций.

PUSH Π² стСк:

  • ΠΈΠ· рСгистра ( push ax )
  • ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· рСгистров ( push [ax] )
  • ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ инструкции ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ( push [4] )
  • ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ суммС значСния Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· рСгистров ΠΈ значСния ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ( push [ax+4] )
  • константного значСния ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ( push 5 )

POP ΠΈΠ· стСка Π²:

  • Π² рСгистр ( pop ax )
  • Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· рСгистров ( pop [ax] )
  • Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ инструкции ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ( pop [4] )
  • Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ суммС значСния Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· рСгистров ΠΈ значСния ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ( pop [ax+4] )

Π’Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ IN ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ -float число - ΠΈΠ· Π²Π²ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, считывая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ scanf. Π”Π°Π»Π΅Π΅ считанноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ добавляСтся Π² стСк. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ OUT ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ printf, ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ число Π² Π²Ρ‹Π²ΠΎΠ΄Π΅. АргумСнт инструкции OUT удаляСтся ΠΈΠ· стСка. Π’Π²ΠΎΠ΄ΠΎΠΌ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π²ΠΈΡ€ΡƒΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ тСкстовых Ρ„Π°ΠΉΠ»Π°, опрСдСляСмыС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ процСссора.

НСподдСрТиваСмыС инструкции

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ DRAW Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ содСрТаниС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ строчкам Π΄Π»ΠΈΠ½ΠΎΠΉ, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора. Данная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти являСтся Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² качСствС видСопамяти. Врансляция этой инструкции Π½Π΅ поддСрТиваСтся Π΄Π°Π½Π½ΠΎΠΉ вСрсиСй JIT-компилятора. ΠŸΡ€ΠΈ трансляции инструкция DRAW пропускаСтся ΠΈ Π½Π΅ транслируСтся Π² ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ инструкции

Врансляция инструкций

Π’ соотвСтствиС 16-Ρ‚ΠΈ рСгистрам Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ r86 поставлСны 16 XMM рСгистров Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86. Если Π² процСссС трансляции устанавливаСтся, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ инструкции, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊ RAM, Ρ‚ΠΎ аллоцируСтся массив Ρ‚ΠΈΠΏΠ° float Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎ ΠΈ RAM Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ r86.

ЦСлочислСнныС рСгистры x86 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для сохранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ XMM рСгистров ΠΏΡ€ΠΈ исполнСнии Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… инструкций.

Π’ качСствС стСка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ стСк Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Ρ…86.

Начало трансляции сопровоТдаСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ инструкций, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΡ… цСлочислСнныС рСгистры Π² стСкС Π² соотвСтствии с соглашСниСм ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… System V AMD64 ABI ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… всС XMM рСгистры Π² Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ( инструкции pxor xmm(i), xmm(i) | 0 < i < 15 ).

Если транслируСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ инструкциСй HLT, Ρ‚ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ.

HLT

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ HLT транслируСтся Π² инструкции x86, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ значСния цСлочислСнных рСгистров ΠΈΠ· стСка ΠΏΠΎ значСниям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ сохранСны Π½Π° Π²Ρ…ΠΎΠ΄Π΅. Π—Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉ инструкциСй являСтся ret (x86).

АрифмСтика

АрифмСтика Π² оттранслированном ΠΊΠΎΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ΅ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ r86. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ произвСдСния арифмСтичСского дСйствия, Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Одно ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ пСрСмСщаСтся Π² XMM0 рСгистр, Π΄Π°Π»Π΅Π΅ производится арифмСтичСская опСрация со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, находящимся Π² стСкС. ПослС этого рСгистр RSP увСличиваСтся Π½Π° 8, Ρ‚Π΅ΠΌ самым удаляя ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· стСка. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния располагаСтся Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка, занимая мСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊ ΠΊΠ°ΠΊ всС 16 XMM рСгистров содСрТат Π² сСбС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Ссли Π½Π΅ исполняСтся ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ инструкция пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ…, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ XMM0 сохраняСтся Π² рСгистрС r15d, Π° ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ восстанавливаСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ADD

movd r15d, xmm15

movss xmm15, dword [ rsp + 8 ]

adds xmm15, dword [ rsp ]

add rsp, 8

movss dword [ rsp ], xmm15

movd xmm15, r15d

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ… - PUSH ΠΈ POP

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… трансляции Π½ΠΈΠΆΠ΅ Start_addr - условноС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ адрСса Π½Π°Ρ‡Π°Π»Π° float массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.

PUSH
  1. PUSH Π² стСк ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· 16 рСгистров: Π‘Π½Π°Ρ‡Π°Π»Π° опрСдСляСтся, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠ· 16 рСгистров Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ unsigned char Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π”Π°Π»Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ XMM рСгистра конвСртируСтся Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· цСлочислСнных рСгистров Π² своС цСлочислСнноС прСдставлСниС. Π”Π°Π»Π΅Π΅ происходит push ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ячСйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.

cvtss2si r13d, xmm(i)

push qword [ Start_addr + r13d * 4]

  1. Push ΠΈΠ· рСгистра Π² стСк: Аналогично ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² интсрукции рСгистр опрСдСляСтся ΠΏΠΎ unsigned char Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

sub rsp, 8

movss dword [rsp], xmm(i)

  1. Push Π² стСк ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ индСксу, опрСдСляСмому float Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°: Float Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ считываСтся ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, приводится ΠΊ Ρ†Π΅Π»ΠΎΠΌΡƒ числу (Ρ‚ΠΈΠΏΡƒ unsigned int) . Π”Π°Π»Π΅Π΅ инициализируСтся инструкция, которая ΠΊΠ»Π°Π΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² цСлочислСнный рСгистр r13d. ПослС этого происходит push.

mov r13d, index

push qword [ Start_addr + r13d * 4]

  1. Push константного значСния Π² стСк: Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² стСк, опрСдСляСтся числом float Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. На основС float значСния гСнСрируСтся unsigned int Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎ равная ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ float числа. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ добавляСтся Π² стСк.

push Constant_value

  1. Push Π² стСк ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ суммС значСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· рСгистров ΠΈ значСния float ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Из Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° значСния, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ - unsigned char - опрСдСляСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² инструкции XMM рСгистр, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ конвСртируСтся Π² цСлочислСнноС прСдставлСниС Π² рСгистр r13d. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ - float - приводится ΠΊ цСлочислСнному ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΈ умноТаСтся Π½Π° 4, Ρ‚.ΠΊ. sizeof(float) == 4. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ подставляСтся Π² ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΡƒΡŽ Π΅Π³ΠΎ Π² r14d. ПослС этого происходит push.

cvtss2si r13d, xmm(i)

mov r14d, Imm_value_from_binary_code

push qword [ Start_addr + r13d * 4 + r14d ]

POP

Врансляция инструкции POP происходит Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ схоТС с трансляциСй инструкции PUSH, поэтому ограничимся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ инструкций Π±Π΅Π· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π².

  1. Pop ΠΈΠ· стСка Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· рСгистров:

cvtss2si r13d, xmm(i)

pop r14

mov dword [ Start_addr + 4 * r13d ], r14d

  1. Pop ΠΈΠ· стСка Π² рСгистр:

movss xmm(i), dword [ rsp ]

add rsp, 8

  1. Pop ΠΈΠ· стСка Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ индСксу, опрСдСляСмому Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

mov r13d, Index_from_binary_code

pop r14

mov dword [ Start_addr + r13d * 4 ], r14d

  1. Pop ΠΈΠ· стСка Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ индСксу, Ρ€Π°Π²Π½ΠΎΠΌΡƒ суммС значСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· рСгистров ΠΈ значСния ΠΈΠ· Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

cvtss2si r13d, xmm(i)

mov r15d, (unsigned int) (float value from binary) * 4

pop r14

mov dword [ Start_addr + r13d * 4 + r15d ], r14d

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ сравнСния: EQ, NEQ, MR, MRE, LS, LSE

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния Π΄Π°Π½Π½Ρ‹Ρ… инструкций Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ноль ΠΈΠ»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ( ΠΈΡ… float прСдставлСниС ) Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π² зависимости ΠΎΡ‚ сравнСния Π΄Π²ΡƒΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ трансляции инструкции MR

  1. БохраняСм значСния XMM0 ΠΈ Π₯ММ13 Π² цСлочислСнных рСгистрах:

movd r15d, xmm0

movd r13d, xmm13

  1. ΠžΠ±Π½ΡƒΠ»ΡΠ΅ΠΌ рСгистр XMM13

pxor xmm13, xmm13

  1. Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π΄Π²Π° значСния с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„Π»Π°Π³ΠΈ x86

movss xmm0, dword [ rsp ]

comiss xmm0, dword [ rsp + 8 ]

  1. Условный Π΄ΠΆΠ°ΠΌΠΏ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌΡƒ инструкции сравнСния (Ρ‚ΠΈΠΏ условного 'jump'Π° зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° инструкции сравнСния:

jbe $ + sizeof (next instruction )

  1. Π’ случаС, Ссли условный Π΄ΠΆΠ°ΠΌΠΏ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π», Π° Π·Π½Π°Ρ‡ΠΈΡ‚ сравнСниС Π²Π΅Ρ€Π½ΠΎ, устанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра Π₯ММ13 Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ

movss xmm13, dword [ Address of 1 constant value ]

  1. ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ стСк ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² инструкции сравнСния

add rsp, 16

  1. Push значСния xmm13 рСгистра Π² стСк

sub rsp, 8

movss dword [ rsp ], xmm13

  1. ВосстанавливаСм значСния Π₯ММ0 ΠΈ Π₯ММ13 ΠΈΠ· цСлочислСнных рСгистров

movd xmm0, r15d

movd xmm13, r13d

УсловныС ΠΈ бСзусловный 'jump'Ρ‹, CALL ΠΈ RET

  1. ΠŸΡ€ΠΈ трансляции всС Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ адрСса, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ 'jump'ΠΎΠ², ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² смСщСния ΠΎΡ‚ адрСса инструкции 'jump'Π° Π΄ΠΎ Π΅Π³ΠΎ мСста назначСния. Π­Ρ‚ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ для near relative 'jump'ΠΎΠ² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86. МаксимальноС смСщСниС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠΆΠΈΡ‚ΡŒ 'jump' ограничиваСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСгмСнта.
  2. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ трансляции инструкция r86 JMP, CALL ΠΈ RET ΡΠ²Π»ΡΡŽΡ‚ΡΡ соотвСтсвСнно near relative вСрсии jmp, call ΠΈ ret инструкций Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86.
  3. Π’Π°ΠΊ ΠΊΠ°ΠΊ смСщСниС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ условный 'jump' Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Ρ…86 мСньшС, Ρ‡Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ сСгмСнта ΠΊΠΎΠ΄Π°, условныС 'jump'Ρ‹ Ρ‚Ρ€Π°Π½Π»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. НиТС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ трансляции JA (r86) Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ x86.

add rsp, 16

movd r15d, xmm0

movss xmm0, dword [ rsp - 16 ]

comiss xmm0, dword [ rsp - 8 ]

movd xmm0, r15d

jbe $ + sizeof (near relative jump)

jmp (Offset to destination)

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π²ΠΎΠ΄ ΠΈ Π²Π²ΠΎΠ΄

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠ΅ матСматичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - POW, SIN, COS ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ IN ΠΈ OUT Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡ‚ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стандартной Π±ΠΈΠ±Π»Π΅ΠΎΡ‚Π΅ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, написанной ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этих инструкций. Π€ΡƒΠ½ΠΊΠΈΠΈ, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠ΅ синус, косинус ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ матСматисчСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ <math.h>. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС трансляции смСщСния Π² инструкциях call ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Π½ΡƒΠ»ΡŽ, Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ этапС - Π²ΠΎ врСмя ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π° - Π² Π΄Π°Π½Π½Ρ‹Π΅ инструкции ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ высчитанныС смСщСния.

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ трСбуСтся стСк, Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Ρƒ 16 Π±Π°ΠΉΡ‚, поэтому ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² сопровоТдаСтся Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ стСка ΠΏΡƒΡ‚Ρ‘ΠΌ вычислСния остатка ΠΎΡ‚ дСлСния значСния рСгистра RSP Π½Π° 16. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прибавляСтся ΠΊ RSP ΠΈ сохраняСтся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· цСлочислСнных рСгистров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ своСго значСния ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ соглашСнию ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ…. ПослС возвращСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, прибавлСнная ΠΊ rsp, вычитаСтся ΠΈΠ· этого рСгистра.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сопровоТдаСтся сохранСниСм всСх Π₯ММ рСгистров Π² стСкС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎ соглашСнию ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π₯ММ рСгистров Π½Π΅ сохраняСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ трансляции SIN:
  • сохраняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π₯ММ0

movd r15d, xmm0

  • ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ РОР ΠΈΠ· стСка Π² Π₯ММ0

movss xmm0, dword [ rsp ]

add rsp, 8

  • сохраняСм Π₯ММ рСгистры с 1-Π³ΠΎ ΠΏΠΎ 15-Ρ‹ΠΉ Π² стСкС

  • Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ стСк Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Ρƒ 16

mov r14, rsp

and r14, 0xF

add rsp, r14

  • call ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стандратной Π±ΠΈΠ±Π»Π΅ΠΎΡ‚Π΅ΠΊΠΈ

  • восстанавливаСм значСния Π₯ММ рСгистров с 1-Π³ΠΎ ΠΏΠΎ 15-Ρ‹ΠΉ ΠΈΠ· стСка

  • ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ PUSH ΠΈΠ· Π₯ММ0 Π² стСк

sub rsp, 8 movss dword [ rsp ], xmm0

  • восстанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π₯ММ0 рСгистра, сохранСнноС Π² цСлочислСнном рСгистрС movd xmm0, r15d

ΠŸΠ°Ρ‚Ρ‡ΠΈΠ½Π³ адрСсов 'jump'ΠΎΠ² ΠΈ 'call'ΠΎΠ²

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ смСщСния всСх условных ΠΈ бСзусовных jump'ΠΎΠ² ΠΈ 'call'ΠΎΠ², производятся дСствия Π² нСсколько шагов

  • На этапС трансляции Π² динамичСском массивС сохраняСтся соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ всСми адрСсами Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈ Π² ΡƒΠΆΠ΅ оттранслированном ΠΊΠΎΠ΄Π΅.
  • На этапС ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π°, происходящСм ΡƒΠΆΠ΅ послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ этапа, Π²Ρ‹ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ смСщСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ соотвСтсвия адрСсов. ВысчитанныС смСщСния ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² 'jump'Ρ‹ ΠΈ 'call'Ρ‹, Π³Π΄Π΅ это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, трансляция ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π² Π΄Π²Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€

JIT-компилятор Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π² частности свёртку констант. Для провСдСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ инициализируСтся список ΠΈ ΠΏΡ€ΠΈ оптимизациях лишниС элСмСнты списка ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ Π½Π° основС списка гСнСрируСтся Π½ΠΎΠ²Ρ‹ΠΉ массив ΠΊΠΎΠ΄ΠΎΠ² инструкций Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… транслятора.

Π‘Π²Π΅Ρ€Ρ‚ΠΊΠ° констант Π²Ρ‡ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ случаи. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

  1. PUSH 0; COS --> PUSH 1
  2. PUSH 2; PUSH 3; ADD --> PUSH 5
  3. PUSH [ax+5]; PUSH 0; MUL --> PUSH 0
  4. PUSH [ax+5]; PUSH 1; MUL --> PUSH [ax+5]
  5. PUSH [ax+5]; PUSH 0; ADD --> PUSH [ax+5]

ВСстированиС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ, искуствСннно создадим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ оптимизация Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сократит количСство вычислСний. Для этого запустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΡƒΡŽ 2^10 10,000,000 Ρ€Π°Π· Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ JIT-компилятора сначала Π±Π΅Π· Ρ„Π»Π°Π³Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ сравним ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния Π² ΠΎΠ±ΠΎΠΈΡ… случаях.

no opt -opt flag
time, sec 0,285 0,100

МоТСм ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ситуациях, свСртка констант позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π΄Π²ΡƒΡ…ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния

Для сравнСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ процСссором ΠΈ JIT-компилятором ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ Π² сСбя большой объСм вычислСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ врСмя трансляции ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ исполнСнии JIT-компилятора Π±Ρ‹Π»ΠΎ ΠΌΠ°Π»ΠΎ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, приходящимся Π½Π° нСпосрСдствСнно вычислСния Π² самой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Для провСдСния тСста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ компилятор, написанный Π² качСствС ΡƒΡ‡Π΅Π±Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ сСмСстрС. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ компилятора являСтся Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, содСрТащий инстуркции Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС 'Harry Potter'. Она Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° 34 Π² Ρ†ΠΈΠΊΠ»Π΅ 100,000 Ρ€Π°Π·. Для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ built-in ΠΎΠΏΡ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки 'time', Π² качСствС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ time 'user'. КаТдоС ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ 5 Ρ€Π°Π· ΠΈ усрСдним ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния. Π’Π°ΠΊ ΠΆΠ΅ вычислим срСднСквадратичноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

CPU JIT
time, sec 26,154 Β± 0,170 0,106 Β± 0.014

Как ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ, врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с использованиСм JIT-компилятора мСньшС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ процСссоров Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² 240 Ρ€Π°Π·.

About

Binary translator from binary code for virtual processor to x86

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published