x86拡張命令一覧表 MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4拡張命令の早見表。各命令の詳しい説明は割愛します。 (2008/09/28更新) 各拡張命令と命令群 MMXレジスタ整数命令 XMMレジスタ整数命令 MMXレジスタ浮動小数点命令 XMMレジスタ浮動小数点命令 型変換命令 制御命令 更新履歴 各拡張命令と命令群 各拡張命令と、このページで用いている命令群の対応表です。 各拡張命令と命令群の対応表 拡張命令セット命令群
x86拡張命令一覧表 MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4拡張命令の早見表。各命令の詳しい説明は割愛します。 (2008/09/28更新) 各拡張命令と命令群 MMXレジスタ整数命令 XMMレジスタ整数命令 MMXレジスタ浮動小数点命令 XMMレジスタ浮動小数点命令 型変換命令 制御命令 更新履歴 各拡張命令と命令群 各拡張命令と、このページで用いている命令群の対応表です。 各拡張命令と命令群の対応表 拡張命令セット命令群
この文書では GNU リンカ ld バージョン 2.11 を説明する. 本文書は,GNU Free Documentation License の条項の下で配布されている. このライセンスの写しは,"GNU Free Documentation License" という セクションに記載されている. 翻訳についての問い合わせは `yabuki at sra.co.jp' まで。
x86には8つの汎用レジスタがある。 各レジスタには使用目的があるので、それに応じて使い分けることでコードが分かりやすくなるし、命令も最適化される。また同じ命令がたくさん並ぶことになるので、圧縮の効率も上がる。 って http://www.swansontec.com/sregisters.html が言ってます。 名前 英語名 使用目的 用意されている専用命令 EAX Accumulator Register 戻り値や演算など movやxchgやaddやxorなど、移動やスワップや各種計算 EBX Base Register アドレスを指す 特殊なのは16bit-modeのときだけで、32bit-modeのときはただの汎用レジスタ ECX Count Resister 繰り返しの回数 loopやrepやjcxzなど、繰り返しやジャンプ条件 EDX Data Resister データの一時
アセンブリコードをアセンブルすると機械語になる。こういう説明が世の中じゃされてるけど、でもそれは半分ウソ。アセンブリコードの中でも機械語に直接対応しないものがある。それがディレクティブと呼ばれているもので、ドットから始まる命令がこれにあたる。 疑似命令 (psuedo-ops) とも呼ばれるこのアセンブラディレクティブは、機械語への直接の対応ではなくて、アセンブラ(GNU as)に対する命令。 前回の記事で説明したのはセクションについてだけだったけれども、ディレクティブにはもっといろいろな意味がある。 以下、その具体的な例を挙げていくよ。 文字列を配置する [.ascii .asciz .string] 文字列を配置するディレクティブは三種類ある。 .ascii .asciz .stringの三つだ。 .ascii は、カンマで区切られたゼロ個以上の文字列を、\nや\t、\0などのエスケー
最近は全然何も作ってないんですが、本読んでてprintfの動作について思い当たる節があったんで、ちょろーんとメモ。 スタックの積まれ方 |--------|--------|--------|--------| |--------|------〜 | | | | | → | | |ローカル| | 直前の |リターン| 積 |ローカル| | 変数 | 引数 |フレーム|アドレス| む | 変数 | 引数〜 | | | | | → | | |--------|--------|--------|--------| |--------|------〜 ←高位アドレス 下位アドレス→ スタックには、関数が呼ばれるたびにデータが高位アドレスから下位アドレスへと乗せられていくんだったよね。*1 上図はスタックの乗り方。 で、前はすっかり忘れてたけどprintfも関数なのよね。だ
キーワード セクション, オブジェクトファイルフォーマット, .text, プログラムローダ, ELF(Executable and Linkable Format) これだけは覚えよう プログラムは複数のセクションという単位に分割されている 原因と原理 私たちが日ごろ作っているプログラムは、ノイマン型コンピュータ上で動きます。ノイマン型コンピュータというのは、プログラムをメモリに蓄えているタイプのコンピュータ(Program stored computer)を指し、プロセッサとメモリを持ったものは大体ノイマン型です。当然私たちのプログラムもメモリにロードされて動いています。 プログラムが動くとき、さまざまな用途でメモリが使用されます。その用途は、機械語をおくためや、変数として値を格納しておくため、またC言語などでは関数呼び出しを行うためのスタックとして使用するため、mallocなどで動的
Xbyak - x86, x64 JIT assembler - .frame(English) .frame(x86の究極の最適化手法?) Xbyak(カイビャック)はx86(IA32), x64(AMD64, x86-64)のマシン語命令を生成するC++のクラスライブラリです. プログラム実行時に動的にアセンブルすることが可能なため, 柔軟な最適化(動的コード生成)が可能となります(利用シーン:量子化の高速化, 式の計算). 暗号ライブラリに使って高速な実装をしてみた(very fast etaT pairing for Core 2 Duo) ヘッダファイルオンリー xbyak.hをインクルードするだけですぐ利用することができます(32bit, 64bit両対応). Windows Xp(32bit, 64bit), Vista/Linux(32bit, 64bit)/Intel
ふと,qsort の第四引数に直接 C のコード片を渡せたら面白いんじゃないか ? とか思って,TCC を使ってみたら簡単にできました. つまり,こういうこと qsort(... , compile("int lambda(int *x, int *y) {return(*x>*y)?1:(*xtcc-0.9.23.tar.gz とかを持ってきて,tar xvf して configure ; make して su して make install しておいてください.TCC には,普通の爆速 C コンパイラ tcc と,C 言語のコード片を機械語に変換するライブラリ libtcc.[h/a] が含まれています.libtcc の API については,libtcc で C のソースコードを eval などを. ソースは,一見長めに見えますが,これは単に,libtcc.h で API として公開さ
Binary Hacks に、「インラインアセンブラをちょっとだけ使って、gccに小さなhello worldバイナリを出力させる」というネタを書きました(Hack #25: glibcを使わないでHello Worldを書く)。その補足という訳でもないのですが、先日shinh先生と焼肉など食べておりましたところ、セクションヘッダを削ってサイズ縮小する話は紹介してもよかったんじゃまいかとツッコミをいただきましたので、(あまり親切な記述ではないですが)書いてみます。「gccにコードを吐かせる」「アセンブリ言語部分にあまり凝らない」という条件で、132バイトまで削ります(書籍だと488バイト)。 えー、hello world なソースコード(末尾に添付)を次のようにコンパイルして*1、 % gcc -m32 -Os -fno-builtin -fomit-frame-pointer -fno-
アドレッシングモード(Addressing Mode)は、CPUの命令セットアーキテクチャ(ISA)において、命令のオペランド部(演算の対象となるデータのこと)を表すための方法のことである。一般に、プロセッサの命令において、オペランドとその結果を出力する場所が必要である。アドレッシングモードは、結果を出力する場所をオペランドと同じ場所とし、オペランドの領域に結果を書き戻す方法である。これによって、命令での場所の指定が最小限に抑えられる。そのため、狭義のアドレッシングモードでは、オペランドとして使用すべきメモリ領域を指定する。しかし、広義には、レジスタを指定したり、値が命令のオペランドとして直接与えられたりする場合も含まれる。 プログラミングの観点では、アドレッシングモードはコンパイラ開発を行う時やアセンブリ言語を利用する際に重視される。 コンピュータ・アーキテクチャが異なれば、それぞれに独
Linux/インラインアセンブラ Linux get_current 関数を例にインラインアセンブラを説明する. Linux カーネルで使われているアセンブラは GAS (GNU Assembler) であり,インラインアセンブラの表記もこれに従う.GAS は Intel 表記ではなく,AT&T 表記を利用するアセンブラであり,Intel のマニュアルを読みながら GAS でコーディングする場合は注意が必要である. get_current (include/asm/current.h)の定義は次のようになっている. static inline struct task_struct * get_current(void) { struct task_struct *current; __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方) 出典検索?: "呼出規約" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2020年12月) 呼出規約(よびだしきやく)ないし呼出慣例(よびだしかんれい)(英: calling convention)は、コンピュータの命令セットアーキテクチャごとに取り決められるABIの一部で、サブルーチンが呼出される際に従わねばならない制限などの標準である。名前修飾について、データを渡す「実引数」、戻るべきアドレスである「リターンアドレス」、データを戻す「返戻値」などを、スタックなどに対してどのように格納するのか、また各レジスタを、呼び出し側とサブルーチンのどちらの
現在、アセンブラを使わなければならないという状況はあまりありませんが、最適化をする場合はアセンブラを知っている方がなにかと有利です。特に、コンパイラの吐いたコードを吟味することはとても重要です。よってここでは、アセンブラコードを読む能力と、簡単なアセンブラコードを書く能力を身に付けることを目標とします。 この記事は Windows 上で VC++ を使う場合を想定して書いていますが、BCC でも殆ど同じですし、gcc でも少し書き方を変えれば使えます。Intel のプロセッサ上で動く Linux 等でも基本的な部分は同じですし、命令セットの異なるプロセッサでも、基本的な部分は役に立つと思います。ターゲットは Intel Pentium 系プロセッサです。 第0回 アセンブラってどういうもの? 第1回 代入と基本的な演算 第2回 定数とメモリの扱い 第3回 レジスタについて 第4回 分岐命
x86アーキテクチャは1台のコンピュータで複数のOSを同時に稼働させるようには設計されていない。複数のOSを同時に稼働させるには,ハードウエアとOSの間に,仮想化を実現する「仮想マシン・モニター(Virtual Machine Monitor:VMM)」と呼ぶソフトウエアを稼働させる必要がある。VMware製品やMicrosoftの「Virtual Server」,XenSourceの「Xen」などの代表的なVMMが,どのようにして複数OSの同時稼働を実現しているのか見ていこう。 x86アーキテクチャの世界でも「仮想化」が注目されている。仮想化と一言で言っても,1台のコンピュータ上で複数の処理を実現するCPUの仮想化,ストレージの仮想化,ネットワークの仮想化など,様々な種類の技術があり,1台のコンピュータを仮想化によって分割するテクノロジは,約40年にもおよぶ歴史がある。x86アーキテクチ
普通のやつらの下を行け: ptrace で実行中のプロセスにちょっかいを出す Linux などの多くの Unix 的なOS には ptrace というシステムコールがあります。 ptrace を使うと実行中のプロセスに対して、レジスタの書き換えやメモリ上のデータの書き換えといったさまざまな操作を行うことができます。 普通のやつらの下を行けの第6回として、今回は ptrace を使って実行中のプロセスにちょっかいを出す方法を取り上げたいと思います。 ptrace とは デバッガの理論と実装 に次のような記述があります。 Unix の ptrace() は本物のデバッガ API (アプリケーションプログラムインターフェイス) の一例であり、商品に相応しい品質を持ったデバッガをサポートするために設計された、最初の専用 API の1つである。 ptrace はデバッガ用に作られた API のようで
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く