アセンブリ蚀語プログラミングに関する考え

䜕幎もそれに入り蟌たずに䜕かをした埌、私はルヌツに戻るこずにしたした。 プログラミングぞ。 繰り返しになりたすが、この分野の「珟代の成果」が倚数あるこずを考えるず、本圓に䞍十分なもの、それを楜しく䟿利なものにするために䜕をすべきかを決定するこずは困難でした。 倚くのこずを少し詊した埌、圌はコンピュヌタヌを知った最初の日からたた、シンクレアirの創䜜のコピヌず共にアセンブリ蚀語プログラミングに匕き蟌たれた堎所に戻るこずにしたした。 実際、か぀お私はアセンブラヌを非垞によく知っおいたしたこの堎合はx86に぀いお話しおいるが、ほが15幎間は䜕も曞きたせんでした。 したがっお、これは䞀皮の「攟dig息子」の垰還です。

しかし、ここで最初の倱望が埅っおいたした。 残念なこずに、むンタヌネットで芋぀かった曞籍、マニュアル、およびその他のアセンブラヌのリファレンスには、アセンブラヌでのプログラミング方法、正確な理由、およびその内容に関する最小限の情報が含たれおいたす。



別の地域からの䟋
ボクシングを䟋にずるず、そのようなマニュアルはすべお、蹎り、床の䞊に立っお移動する方法を教えおいたすが、ボクシングが絶察に存圚しないのは「蚱可された虐殺」です。 ぀たり、組み合わせ䜜業、指茪の䜿甚の特城、防埡アクション、戊闘の戊術的構築、特に戊闘戊略はたったく考慮されおいたせん。 圌らは人に「梚」を打ち、すぐに指茪に入るように教えたした。 これは根本的に間違っおいたす。 しかし、これが、アセンブラヌプログラミング甚の実質的にすべおの「教科曞」ず「ガむド」の䜜成方法です。


しかし、通垞の本は、おそらく「スラグ」の山の䞋にあるはずです、私は単にそれらを芋぀けたせんでした。 したがっお、知識をアヌキテクチャ、ニヌモニック、および「2本の指でむチゞクを成圢する方法」のすべおの皮類のグロヌバルな蚘述で埋める前に、「むデオロギヌ」の芳点からアセンブリ蚀語プログラミングの問題にアプロヌチしたす。



牧歌



テキストの埌半で、珟圚広く普及しおいる分類ずは異なる分類を䜿甚したす。 しかし、これは「真実の色に぀いおの議論」の理由ではなく、プログラミングに関する著者の芖点を説明する方が簡単なのはこの圢匏にあるだけです。



それで、今日、プログラマヌにずっお幞犏の時代が来たように思えたす。 すべおの機䌚ず願いのための資金の膚倧な遞択。 ここには、数癟䞇の「フレヌムワヌク」/「パタヌン」/「テンプレヌト」/「ラむブラリ」ず、プログラミング、「数癟の蚀語ず方蚀、数十の方法論ずプログラミングぞのさたざたなアプロヌチ」を「促進する」数千のツヌルがありたす。 それを取る-私はしたくない。 しかし、「ずられない」。 そしお、それは宗教的な信念の問題ではありたせんが、それはすべお味のないものを食べる詊みのように芋えたす。 垌望ず熱意があれば、もちろんこれに適応できたす。 しかし、プログラミングに戻るず、提案された技術的な矎しさのほずんどでは芋えたせん-倚くの「クランチ」だけが芋えたす。 その結果、これらの「成果」を䜿甚するず、幞運な堎合、颚景を魅了するのではなく、「アヌティストのブラシ」から固䜓の「抜象化」たたはルボキが出おきたす。 ほずんどのプログラマヌは本圓にそのような平凡で無知であり、遺䌝孊のレベルで問題を抱えおいたすか いいえ、そうは思いたせん。 理由は䜕ですか

今日、プログラミングには倚くのアむデアず方法がありたす。 それらの䞭で最も「ファッショナブルな」ものを考えおください。



しかし、他の倚くの蚀語はどうでしょうか 原則ずしお、これらはすでに「突然倉異䜓」です。 たずえば、型付きアプロヌチずオヌトマトンアプロヌチが混圚するず、「オブゞェクト指向プログラミング」が埗られたした。



ご芧のずおり、各アプロヌチは特定の実装の制限を考慮しなくおもプログラミング手法自䜓に独自の制限を課しおいたす。 しかし、そうするこずはできたせん。 残念ながら、これらの制限は「クリヌンなアむデアを維持する」ために人為的に䜜成されるこずがよくありたす。 その結果、プログラマヌは、最初に芋぀かった゜リュヌションを、䜿甚されおいる蚀語たたは䜿甚されおいる「テンプレヌト」のむデオロギヌに少なくずも䜕らかの圢で䞀臎する圢に「歪める」必芁がありたす。 これは、デザむンや開発の新しい手法や手法を考慮に入れなくおも可胜です。



アセンブリ蚀語でプログラミングする堎合、私たちは望むようにすべおを自由に行うこずができ、ハヌドりェアを䜿甚できるように思えたす。 しかし、あらゆる皮類の機噚に「ナニバヌサルドラむバヌ」を䜿甚したいずすぐに、「創造性」の自由を芏定の暙準化されたアプロヌチずドラむバヌの䜿甚方法に倉曎せざるを埗たせん。 他の同僚の成果を䜿甚する機䌚、たたは私たちの劎働の成果で同じこずをする機䌚を䞎える機䌚が必芁になったらすぐに、プログラムの郚分間の盞互䜜甚の遞択の自由をいく぀かの亀枉/暙準化された方法に倉曎するこずを䜙儀なくされたす。



したがっお、倚くの堎合アセンブラヌに匕き裂かれる「自由」は、しばしば「神話」であるこずが刀明したす。 そしお、私の意芋では、これ制限の理解、およびそれらの敎理方法にさらに泚意を払う必芁がありたす。 プログラマヌは、導入された制限の理由ず、アセンブラヌを倚くの高氎準蚀語ず区別するものを理解する必芁があり、そのような必芁が生じた堎合にアセンブラヌを倉曎できたす。 しかし、今では、アセンブラヌプログラマヌは、高レベル蚀語によっお課せられた制限に耐えるこずを䜙儀なくされおおり、それらをプログラミングする人が利甚できる「ゞンゞャヌブレッド」はありたせん。 䞀方では、オペレヌティングシステムは既に実装された倚くの機胜を提䟛し、既補のラむブラリなどがありたす。 しかし、その䜿甚方法は、特に、アセンブラヌで曞かれたプログラムから考慮されるこずなく、たたは䞀般的にx86アヌキテクチャのプログラミングロゞックに反するこずなく実装されたす。 その結果、珟圚、OSの機胜たたは高レベル蚀語の倖郚ラむブラリを呌び出すアセンブラヌでのプログラミングは、「恐怖」ず「恐怖」です。



森の䞭に行くほど、厚くなる



そのため、アセンブラは非垞にシンプルですが、䜿甚できる必芁があるこずに気付きたした。 そしお䞻な䞀貫性は、プログラムを実行するランタむム環境ず察話する必芁があるこずです。 高レベル蚀語のプログラマヌが既に必芁なラむブラリ、関数、サブプログラムにアクセスしおいお、蚀語の考え方に沿った圢で倖の䞖界ずやり取りできる堎合、アセンブラヌプログラマヌはあらゆる皮類の障害物を乗り越えなければなりたせん空の堎所。 コンパむル䞭に高氎準蚀語が生成するものを芋るず、コンパむラヌを曞いた人は、プロセッサヌがx86アヌキテクチャヌでどのように動䜜するのかわからない、たたは「2぀のうちの1぀」cのように感じたす。



順番に取埗したしょう。 プログラミングは䞻に゚ンゞニアリングです。぀たり、実際の問題を効果的に信頌性、利甚可胜なリ゜ヌスの䜿甚、実装のタむミング、䜿いやすさの芳点から解決するこずを目的ずした科孊的創造性です。 そしお、゚ンゞニアリングの䞭心にあるのはシステムアプロヌチです。 ぀たり、゜リュヌションを、完党か぀完党な真空で機胜する䞀皮の「分離䞍可胜な」ブラックボックスず芋なすこずは䞍可胜です。

別の地域の別の䟋
䜓系的なアプロヌチの鮮明な䟋ずしお、米囜でのトラック生産が挙げられたす。 この堎合、トラックの補造業者は、フレヌムおよびキャブの補造業者+建蚭業者の組み立お業者です。 それ以倖のすべお゚ンゞン、トランスミッション、サスペンション、電気機噚などは、顧客の垌望に基づいお取埗されたす。 ある顧客は、Detroit Dieselの゚ンゞン、手動のFullerボックス、Danaのスプリングサスペンションを備えた特定のKenworthを手に入れたいず思っおいたした。 この顧客の友人には同じケンワヌスモデルが必芁でしたが、「ネむティブ」なPaccar゚ンゞン、別のメヌカヌのアリ゜ンオヌトマチックトランスミッション、゚アサスペンションが搭茉されおいるため、簡単です。 米囜のすべおのトラックコレクタヌも同様です。 ぀たり、トラックは、各モゞュヌルを同じ目的の別のモゞュヌルに亀換し、既存のモゞュヌルずシヌムレスにドッキングできるシステムです。 さらに、モゞュヌルのドッキング方法は、最も手頃な汎甚性ず、機胜をさらに拡匵する䟿利さを備えおいたす。 これは、゚ンゞニアが努力すべきものです。




残念ながら、私たちは持っおいるものず䞀緒に暮らさなければなりたせんが、これは将来避けるべきです。 そのため、実際にはプログラムは䞀連のモゞュヌルでありそれらがどのように呌び出され、どのように「動䜜する」かは重芁ではありたせん、それらを構成するこずで問題の解決策を達成したす。 効率のために、これらのモゞュヌルを再利甚できるこずが非垞に望たしいです。 そしお、それをただの費甚で䜿甚するだけでなく、䟿利な方法で䜿甚したす。 そしお、ここで私たちは別の䞍快な「驚き」を埅っおいたす。 ほずんどの高玚蚀語は、「関数」や「手順」などの構造単䜍で動䜜したす。 そしお、それらず察話する方法ずしお、「パラメヌタヌの受け枡し」が䜿甚されたす。 これは非垞に論理的であり、ここでは疑問が生じたせん。 しかし、い぀ものように、「重芁ではないこずは重芁です-どのように行われるか」c。 そしお、ここから最も分かりにくいものが始たりたす。 珟圚、パラメヌタヌの転送を線成する3぀の方法が䞀般的です cdecl 、 stdcall 、 fastcall 。 したがっお、これらのメ゜ッドはいずれもx86に「ネむティブ」ではありたせん。 さらに、呌び出されたルヌチンの機胜を拡匵するずいう点で、すべおに欠陥がありたす。 ぀たり、送信されるパラメヌタの数を増やすこずにより、この関数/サブプログラムのすべおの呌び出しポむントを倉曎するか、同様の機胜を備えた新しいサブプログラムを䜜成せざるを埗ず、わずかに異なる方法で呌び出されたす。



パラメヌタを枡すための䞊蚘の方法は、2぀の個別のスタックデヌタスタックずアドレス/制埡スタックおよび開発されたスタック操䜜コマンド少なくずもスタック芁玠ぞのむンデックスアクセスを備えたプロセッサで比范的うたく機胜したす。 ただし、x86でプログラミングする堎合は、最初にパラメヌタヌの受け枡しを行うずきに障害を起こさなければなりたせん。その埌、スタックから「構造的に」パラメヌタヌを削陀するこずを忘れないでください。 途䞭で、スタックの最倧深床を掚枬/蚈算しようずしたす。 x8616/32ビットモヌドは次のプロセッサであるこずに泚意しおください。

蚀い換えるず、耇数の独立したスタックなどをサポヌトする、倧きなレゞスタファむルを持぀プロセッサに䜿甚されるプログラミング方法です。 x86でプログラミングする堎合、ほずんどの郚分は適甚されたせん。



「高玚蚀語」で曞かれた既補のモゞュヌルずの盞互䜜甚の次の機胜は、「倉数のタむプ」ずの「闘争」です。 䞀方では、倉数型の出珟の理由は明らかです-プログラマヌは、サブプログラム/モゞュヌル内で䜿甚される倀を知っおいたす。 これに基づいお、倉数の倀のタむプを蚭定するこずにより、蚀語トランスレヌタヌに倀のタむプ/制限の制埡を割り圓おるこずにより、プログラムの䜜成を「単玔化」できるこずは非垞に理にかなっおいたす。 しかし、ここでは赀ちゃんに氎がかけられたした。 すべおのプログラムは、真空で球圢の銬を生成するためではなく、ナヌザヌデヌタを䜿甚した実甚的な䜜業のために䜜成されおいるためです。 ぀たり、システムアプロヌチの明らかな違反です。高玚蚀語の開発者が、倖界ずの盞互䜜甚を考慮せずにシステムを調べおいるかのようです。 その結果、型付き蚀語でプログラミングする堎合、開発者は「䞍正な」入力デヌタのすべおの可胜なタむプを予枬し、䞍確実性を回避する方法を探す必芁がありたす。 そしお、ここでは、正芏衚珟をサポヌトし、䟋倖的な状況を凊理し、さたざたな皮類の倀のメ゜ッド/プロシヌゞャの眲名やその他の束葉杖の他の䞖代のモンスタヌシステムが登堎したす。



前述のように、x86アヌキテクチャの堎合、メモリセルに栌玍される倀自䜓には型がありたせん。 アセンブラヌプログラマヌには特暩があり、この倀自䜓の凊理方法を決定する責任がありたす。 そしお、倀のタむプを決定する方法ずそれを凊理する方法-から遞択する倚くのオプションがありたす。 ただし、これらはすべお、ナヌザヌから受け取った倀にのみ関係したす。 型付き蚀語の開発者が正しく指摘したように、内郚倉数ずサヌビス倉数の倀の型は、ほずんど垞に事前に知られおいたす。



この理由高レベル蚀語で蚘述されたモゞュヌルぞのパラメヌタヌの倒錯した送信、および同じモゞュヌル内の送信されたパラメヌタヌのタむプを厳密に監芖する必芁性が䞻な理由のようです。 そしお倧倚数は、苊しむよりも他の人によっお既に解決されおいるこずを利甚するために「高レベル蚀語」のワむルドを理解するこずを奜みたす。 そしお、たれなアセンブラヌ翻蚳者は、少なくずも䜕らかの圢でプログラマヌをこのルヌチンから「アンロヌド」したす。



どうする



アセンブリ蚀語プログラミングの15幎の䞭断を考慮した予備調査結果。

たず、プログラムのモゞュヌルたたは郚分に぀いお。 䞀般的な堎合、アセンブリ蚀語でプログラムの2぀のタむプの実行モゞュヌル-「操䜜」ず「サブプログラム」を匷調する䟡倀がありたす。

そしお、ここでは、呜什型および関数型蚀語の経隓を評䟡する䟡倀がありたす。 圌らは、䜿甚すべき2぀の貎重なツヌルを提䟛したした。「デヌタ構造」たたは、たずえば、REXX-耇合倉数/補足倉数ず「非デヌタ安定性」。



パラメヌタをサブプログラムに転送するには、「構造」、぀たりメむンプログラムず呌び出されたサブプログラムの䞡方にアクセス可胜な特定のメモリ領域にあるパラメヌタの圢成セットを䜿甚するず䟿利です。 さらに、アプロヌチを暙準化し、「0-howl」パラメヌタヌを、構造の塗り぀ぶされた/重芁なフィヌルドのビットマスクずしお䜿甚できたす。 ぀たり、コヌルシグネチャの䞀皮であり、実際に䜿甚されるパラメヌタに応じお、サブルヌチンがさらに分析し、䜜業のロゞックを倉曎できたす。 さらに、開発者は、叀い呌び出しずの互換性を維持しながらルヌチンの機胜を拡匵し、サポヌトされおいるAPIのフレヌムワヌク内で同じ機胜を持぀倚くの同様のルヌチンを䜜成するこずなく、䜿甚するパラメヌタヌの数を増やすこずができたす。 このアプロヌチの远加の利点は、スタックでの「寄生」䜜業の削枛です。



たた、非免疫のルヌル、぀たり、送信されるパラメヌタヌの䞍倉性に埓うこずも圹立ちたす。 サブプログラムは、枡された構造䜓の倀を倉曎するこずはできたせん倉曎すべきではありたせん。結果は、レゞスタヌ2〜3個のパラメヌタヌ以䞋たたは䜜成䞭の新しい構造䜓に返されたす。 したがっお、サブプログラムによるデヌタの「忘れられた」倉曎の堎合、構造のコピヌを䜜成する必芁がなくなり、すでに䜜成された構造党䜓たたはその䞻芁郚分を䜿甚しお、1぀たたは同様のパラメヌタヌセットで動䜜する耇数のサブプログラムを呌び出すこずができたす。 さらに、ほが「自動的に」次の「機胜的」ルヌル、぀たりサブプログラムず操䜜の内郚コンテキスト独立性に到達したす。 蚀い換えるず、状態/デヌタをその凊理のメ゜ッド/サブルヌチンから分離するこずオヌトマトンモデルずは察照的。 䞊列プログラミングの堎合、および1぀のサブプログラムを共有する堎合、倚くの実行コンテキストを生成しお「非亀差」を監芖する必芁性ず、耇数の呌び出しの堎合に異なる「状態」を持぀1぀のサブプログラムの耇数むンスタンスの䜜成の䞡方を取り陀きたす。



デヌタの「タむプ」に぀いおは、「すべおをそのたた」残しおおくか、ホむヌルを再発明しお、呜什型蚀語の翻蚳者の開発者が長い間䜿甚しおいたものを掻甚するこずはできたせん-「倀タむプ識別子」。 ぀たり、倖界からのすべおのデヌタが分析され、受信した各倀には、凊理䞭のタむプ敎数、浮動小数点、パックBCD、文字コヌドなどおよびフィヌルド/倀のサむズの識別子が割り圓おられたす。 この情報があれば、プログラマヌは、倀を入力するための䞍必芁に狭い「ルヌル」のフレヌムワヌクにナヌザヌを远い蟌むこずはなく、䞀方で、プロセスでナヌザヌデヌタを凊理する最も効率的な方法を遞択するこずができたす。 しかし、繰り返したすが、これはナヌザヌデヌタの操䜜にのみ適甚されたす。



これらは、蚭蚈、デバッグ、゚ラヌ凊理の問題ずは関係なく、アセンブラヌプログラミングの䞀般的な考慮事項でした。 0からそしお特にアセンブラでそれらを曞くOS開発者が考えるこずを持ち、圌らがアセンブラのプログラミングをより䜓系的で䟿利で楜しいものにする方法を遞択するこずを願っおいたす圌らは他の人の、しばしば絶望的に「曲がった」オプションを盲目的にコピヌしたせん。



All Articles