About Monorail User Guide Release Notes Feedback on Monorail Terms Privacy
私の所属する研究室内では、Linuxカーネル読書会なるものをやっている。教材は詳解Linuxカーネルの第3版。この本は-読んでみると分かるが-x86依存の話が非常に多い。スケジューラの話のあたりになると、Gnu Assemblerなどという暗号(!)でガシガシ書いてあるので、もう訳がわからない。この辺のソースコードの様子は、id:naoya さんのLinux カーネルのコンテキストスイッチ処理を読み解くを見ていただければ分かると思う。そうなってくると、必然的にx86の副読本を買わねばならぬ、となるわけだが、x86を知らない人がいきなりはじめて読む486―32ビットコンピュータをやさしく語るを読むと、多分多くの人が挫折してしまうだろう。というか、私がした。確かに良い本(だと思われる)んだけれど、前提知識が足りないと、所々でつまってしまって、読むスピードが落ちて、あああ、、、僕はダメな子だ、、
Cからasm,逆にasmからCを呼び出すために必要な手続きを呼び出し規約といいます.たとえば前回puts()を使う際に,文字列のポインタをpushしましたが,そういう手続きのことです. x86での規約は大きく分けて3種類あり,細かい部分についてはコンパイラ依存であることも多く,注意が必要です.しかし,ほぼすべてのコンパイラで共通である規約は簡単で覚えやすく,しかも移植性が高くなります.計算処理などOSに依存しにくい部分ではその規約のみに従って記述すれば,Windows/Linux/Macで同一のソースとすることができメンテナンスもしやすくなります. まずは基本の規約(cdecl)をしっかりと使いこなし,必要になってから他のその他の規約を学べばよいでしょう.詳細は呼出規約(Wikipedia)などを参考にしてください.拙文でも多少触れています. 汎用性の高い規約 Cとasmとの間で呼び出しあ
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
すこし前に、straceコマンドもどきを50行くらいで書いてみたことがあるので、それを貼ってみまーす。いきなりコード。あ、C99です。 // strace_modoki.c: Linux/x86専用です。x86_64カーネルでは-m32でコンパイルしても動きません。 #include <stdio.h> #include <unistd.h> #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <asm/user.h> #include <asm/ptrace.h> int main() { int i; static const char* syscallstr[1000] = {0}; for(i = 0; i < 1000; ++i) syscallstr[i] = "???";
Linux カーネルのプロセススケジューラの核である kernel/sched.c の schedule() を読み進めていくと、タスク切り替え(実行コンテキスト切り替え)はその名も context_switch() という関数に集約されていることが分かります。2.6.20 の kernel/sched.c だと以下のコードです。 1839 static inline struct task_struct * 1840 context_switch(struct rq *rq, struct task_struct *prev, 1841 struct task_struct *next) 1842 { 1843 struct mm_struct *mm = next->mm; 1844 struct mm_struct *oldmm = prev->active_mm; 1845 184
General Information[edit | edit source] Examples in this article are created using the AT&T assembly syntax used in GNU AS. The main advantage of using this syntax is its compatibility with the GCC inline assembly syntax. However, this is not the only syntax that is used to represent x86 operations. For example, NASM uses a different syntax to represent assembly mnemonics, operands and addressing
レジスタとはCPU内部で使える変数のことです. C言語ではいくらでも変数を使うことが出来ますが, アセンブリ言語 (以下ASMと略) では, 変数に相当するものは10個もありません. それ以上使いたい場合はメモリに保存する必要があります. 逆に言えばどんな言語の変数でも大抵メモリを利用して実現されています. ただレジスタを使うのに比べて遅くなるので, 小回りの利いたルーチンを書く場合には如何に上手くレジスタを使い回すかが鍵となります. 通常のプログラミングの時に必要なレジスタには次のものがあります. 1. eax, ebx, ecx, edx, esi, edi, ebp, espという32bit汎用レジスタ 汎用なので様々な用途に用いられます. 但し, espはスタック領域を指すためだけに使われます. スタック領域とはC言語で言うところの自動変数や関数のパラメータを
Intel x86,あるいはIA-32と総称されるPCのCPUアーキテクチャは,初代IA-32ともいえるIntel 386DX(1984年)から現在に至るまで,アーキテクチャの根幹は変わっていないものの,いくつかの大きな機能が加えられてきた。SSE,SSE2,そして3DNow!など,いわゆる「拡張命令」と呼ばれる命令セットがそれに当たる。ここではまず,SSE/SSE2など拡張命令の実像に迫ってみることにしよう。 IBM PS2,後にPC/AT互換機に採用され,よくも悪くも事実上の標準となったx86プロセッサは,非常に強力な機能を持つ半面,過去との互換性を重視したために,いくつかの欠点も抱えていた。その欠点が表面化しだしたのは今から6年ほど前,Pentiumプロセッサ(P54C)やPentium Pro(初のP6アーキテクチャ)が利用されていたころだ。 拡張命令セットが構想され発
○GCC x86インラインアセンブラ asm ("命令 source,dest"); ■グローバル変数 --------------------------------------------------------- そのまま使えます #include <stdio.h> int i; int j; main(){ i=10; asm ("movl i,%eax"); asm ("add $10,%eax"); //数値は先頭に$マークを付ける asm ("movl %eax,j"); printf("%d %d\n",i,j); } ▼上のプログラムの書き方を変えたもの #include <stdio.h> int i; int j; main(){ i=10; asm ( "movl i,%eax \n\t" "add $10,%eax \n\t" "movl %eax,j"
GCCでインラインアセンブリを使用 する方法と留意点等 for x86 (1999〜2006年10回改訂、2006年1月22日注意を追加、最終更新日2006年5月27日) 文: A. SAITOH <s-akira at users.sourceforge.net> home ※システム名、CPU名は一般に開発会社の登録商標です。 以下の情報はあまり過度に信用しないで下さい。より正確な情報は、asやgccのinfoから得て下さい。 個々のプロセッサ命令の解説はここでは述べません。そのような技術資料は、インテルやAMDのウェブ サイトのdeveloper向けのページからpdf形式で入手できます。 以下の文及びプログラム例の運用結果に関して、筆者は一切責任を負いません。 参考文献 [0] D. Stancevic, K. Scheibler, J. Leto, Linux Assembly
http://lf.8k.com/X86/1.HTM =========================================================================== TITLE: x86 TIPS AND TRICKS AUTHOR: LAURA FAIRHEAD LAST MODIFIED: 04/00 =========================================================================== 32bit CODE I find it strange that an awful lot of ASM programmers who write real-mode code seem to think that they (i) have to be 8086 compatible? (ii
Code Golf とは? Matzにっき(2006-10-05) より ゴルフとは如何に少ないストロークでホールインするかを競う競技である。 コードゴルフとは、如何に少ないキーストローク(バイト数)で、プログラムを実装できるかを競う競技である。 先日FizzBuzz.com (MS-DOS 16bit版) を作ってみたら、32bit版のプログラムにも挑戦したくなりましたので、x86 32bitで命令長を減らすテクニックについて紹介したいと思います。 ※まずはコード長の比較のみで実行クロック数は競わないことにします。 ■ x86 32bit コード最適化 【問題】EBXレジスタに1を、EAXレジスタに4を代入したい できるだけ短いバイト数でコードを実現するためには、いろいろなx86命令をフル活用することを考えます。 自分の思いついた解答をNASMの記法で書いてみます。 (1) 10byte
Assemble Save Save requires a local system and wscript. MOV AH, 00 # Accept a key and write it to the screen. INT 16 # Hit Q to quit CMP AL, 61 JB 06 #comments are allowed CMP AL, 7A # yep, any comment is allowed JA 02 ;and yes, as of now there is no comment pre-symbol AND AL, DF just append your comment MOV DL, AL MOV AH, 02 INT 21 CMP AL, 51 JNZ E8 MOV AL, 00 MOV AH, 4C INT 21
浮動小数点演算ではまった話 浮動小数点演算のありがちな問題ではまりました。 いろいろ調べているうちに x86 特有のちょっとおもしろい 現象に遭遇したので紹介したいと思います。 パーセンテージの計算 簡単な C のプログラムでパーセンテージを計算しようと思い、 次のようなコードを書きました。 int x, y; ... int a = (double)x / y * 100; int a = x * 100 / y としないのは、 x が大きい場合に x * 100 が オーバーフローを起こす (INT_MAX を越える) ためです。 このコードは一見、期待通りに動いていたのですが、 しばらく使っていると、手元の環境では x = 53, y = 100 のときに a は 53 ではなく 52 になることに気づきました。 これは次の理由によります。 式の最初の (double)53 / 10
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く