C. Аземблэр

хугацааны хязгаарлалт 5 секунд

санах ойн хязгаарлалт 256 мегабайт

оролт стандарт оролт

гаралт стандарт гаралт

Сайн хайлтын программ текстээс тэмдэгт мөр хайхдаа алдахад Игор К.-д нэгэн бодол төржээ : "Яагаад миний программ удаан ажиллаад байнаа" Ингээд тэр кодоо дахин шалгаад "Миний код алдаагүй байна, гэхдээ би яаж сайжруулахыг мэднэ" гэж хэлээд номын сангаас нэгэн том номыг буулгаж ирэв. Номных нь гарчиг "Аземблэр. Түүний шинэ дүрмүүд"

Игор К. номыг анхааралтай уншсаны дараагаар программаа хэд дахин хурдлуулж болохыг анзаараад "Сайн хайлтын программыг өмнөхөөсөө хэд дахин хурдан ажилладаг болохнээ!" - гэж жаргалтай гэх чинь хэлээд ажилдаа оров.

Игорын санааг тодруулж өгье. Түүний хөрвүүлэгч кодыг маш муу хөрвүүлжээ. Стандарт үржүүлэлт нь номон дээрх үйлдлээс илүү удаан ажиллаж байв.

Аземблэр хэл нь 26 бүртгэгч (eax, ebx, ..., ezx) болон хоёр үйлдэлтэй :

  • [$x$] - $x$ хаягт байгаа утгыг буцаана. Жишээ нь, [eax] нь eax бүртгэгч дээр байгаа утгыг буцаана.
  • lea $x$, $y$ - $x$ нь үйлдлийн эзэн байх ба $y$ нь үйлдлийн эзэнд оноогдох утга юм. Жишээ нь, "lea ebx, [eax]" байвал [eax] үйлдлийг гүйцэтгээд [eax] хаяган дээр утгыг ebx хаяган дээр бичих юм.

Эхэндээ энэ үйлдэл нь ойлгомжгүй байв. Энэ үйлдлийг дараах хэлбэрээр бичиж болдог.

lea ecx, [eax + ebx],

lea ecx, [k*eax]

эсвэл

lea ecx, [ebx + k*eax],

энд k = 1, 2, 4 or 8.

Үүний үр дүнд ecx бүртгэгч харгалзан eax + ebx, keax and ebx + keax утгатай болно. Түүнчлэн тоонуудыг хооронд нь үржүүлээд илүү хурдан ажиллуулж болох юм. Хэдэн үйлдэл ашиглаад нэг тоог өөр нэгэн тоогоор үржүүлж болно. Мэдээж eax, ebx, ecx бүртгэгч нараас өөр бусад аль ч бүртгэгчийг ашиглаж болно.

Жишээ нь eax бүртгэгч ямар нэг тоог агуулдаг байг, тэр тоог бид 41-ээс үржүүлэхийн тулд 2 мөр үйлдэл хийнэ :

lea ebx, [eax + 4eax] // одоо ebx = 5eax

lea eax, [eax + 8ebx] // одоо eax = eax + 8ebx = 41*eax

Игор К. дараах асуултын хариу түүний сонирхлыг татаж байв : ямар нэг тоог $n$-ээр үржүүлэхийн тулд хамгийн багадаа хэдэн lea үйлдэл хэрэгтэй ба яаж хийх вэ? Түүнд туслана уу.

Анхандаа Игор К.-д eax тоо байсан ба ebx-ээс ezx хүртэл 0 утгатай бүртгэгч байгаа. Хамгийн сүүлийн мөчид хариу нь аль ч бүртгэгчид байж болно.

Оролт

Оролт зөвхөн $n$ ($1 ≤ n ≤ 255$) тооноос бүрднэ, Igor K.-ийн үржүүлэхийг хүссэн тоо.

Гаралт

Эхний мөрөнд $p$ бүхэл тоо, тоог $n$-ээр үржүүлэхийн тулд хамгийн багадаа хэдэн lea үйлдэл хийснийг илтгэх тоо. Дараагийн $p$ мөрөнд хийсэн үйлдлийг хэвлэнэ. $n$ 1-ээс 255 хүртэл ядаж нэг хариу заавал олдоно.

Үйлдлүүдийг дараах хэлбэрээр хэвлэнэ үү. ( энд $k$ нь 1, 2, 4 эсвэл 8-тай тэнцүү ба $x$, $y$, $z$ аль нэг бүртгэгч нь ):

lea x, [y]

lea x, [y + z]

lea x, [k*y]

lea x, [y + k*z]

Үйлдэл болгоны дараа хоосон зай хэвлэх нь зөвшөөрөгдөхгүйг тэмдэглэе.

Орчуулсан: Б.Алтангэрэл

Жишээ тэстүүд

Оролт
41
Гаралт
2
lea ebx, [eax + 4*eax]
lea ecx, [eax + 8*ebx]
Оролт
2
Гаралт
1
lea ebx, [eax + eax]
Оролт
4
Гаралт
1
lea ebx, [4*eax]
Сэтгэгдлүүдийг ачааллаж байна...