タグ付けされた質問 「assembly」

アセンブリ言語(asm)プログラミングの質問。必ず、使用しているプロセッサや命令セット、およびアセンブラをタグ付けしてください。警告:.NETアセンブリの場合は、代わりにタグ[.net-assembly]を使用してください。Java ASMの場合は、代わりに[java-bytecode-asm]タグを使用してください。

10
なぜx86は醜いのですか?他の人と比較して、なぜ劣っているのですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 8年前に閉鎖。 最近、私はいくつかのSOアーカイブを読んでいて、x86アーキテクチャに対するステートメントに遭遇しました。 サーバーとミニ/メインフレーム、ミックスコアに異なるCPUアーキテクチャが必要なのはなぜですか?言う 「PCアーキテクチャは混乱である、任意のOSの開発者はあなたにそれを言うだろう。」 アセンブリ言語を学ぶことは、努力する価値がありますか?(アーカイブ)は、 「 x86アーキテクチャはせいぜい恐ろしいものであることを理解している」と述べています。 x86アセンブラを学ぶ簡単な方法はありますか? 「ほとんどの大学はMIPSのようなものでアセンブリを教えています。理解するのがはるかに簡単だからです。x86アセンブリは本当に醜いです。」 のような多くのコメント 「ほとんどのアーキテクチャーと比較して、X86はかなりひどい。」 「X86がMIPS、SPARC、PowerPCよりも劣っているのは間違いなく従来の知識です」 「x86は醜い」 検索してみましたが、理由はわかりませんでした。これが私がよく知っている唯一のアーキテクチャであるため、x86が悪いとは思わない。 他の人と比較してx86を醜い/悪い/劣っていると考える理由を誰かが親切に教えてくれますか?

7
コールスタックはどの程度正確に機能しますか?
私はプログラミング言語の低レベルの操作がどのように機能するか、特にそれらがOS / CPUとどのように相互作用するかについて、より深く理解しようとしています。スタックオーバーフローのすべてのスタック/ヒープ関連スレッドのすべての回答を読んだことがあり、それらはすべて素晴らしいものです。しかし、まだ完全には理解していなかったことがあります。 有効なRustコードになる傾向がある疑似コードでこの関数を検討してください;-) fn foo() { let a = 1; let b = 2; let c = 3; let d = 4; // line X doSomething(a, b); doAnotherThing(c, d); } これは、スタックが行Xで次のように見えると想定する方法です。 Stack a +-------------+ | 1 | b +-------------+ | 2 | c +-------------+ | 3 | d +-------------+ …


23
学習アセンブリ[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 3年前休業。 この質問を改善する アセンブリ言語を学ぶことにしました。そうする主な理由は、逆アセンブルされたコードを理解し、コードのより効率的な部分を(たとえば、C ++を介して)書けるようになること、コードケーブなどの処理を実行できることです。アセンブリにはさまざまな種類のアセンブリがあることがわかりました、だから、私が言及する目的のために、私はどのように始めるべきですか?どのようなアセンブリを学ぶべきですか?最初にいくつかの簡単なプログラム(電卓など)を実行して学習したいのですが、目標自体は、IDA Proなどのコードを理解できるように、それに慣れることです。 私はウィンドウを使用しています(違いがある場合)。 編集:それで、誰もがMASMに向かっているようです。高レベルの機能を備えているという点はわかりますが、アセンブリコードプログラマーにとってはすべて良いですが、それは私が探しているものではありません。一般的な逆アセンブラー(IDAなど)に示されていないif、invokeなどの命令があるようです。だから、もし私が聞きたいのは、単に「一般的な」アセンブリプログラマーではなく、私が求めている目的(逆アセンブルされたexeのコードをIDAで読む)にASMを使用する人の意見です。 編集:OK。私はすでに集会を学んでいます。私はMASMを学習していますが、私にとって重要ではない高レベルのものを使用していません。私が今行っているのは、c ++の__asmディレクティブでコードを試すことです。そのため、MASMで最初からすべてを実行しなければならなかった場合よりもずっと速く試すことができます。
102 assembly 

5
「FS」/「GS」レジスタの目的は何ですか?
だから私は次のレジスタとその使用法が何であることになっているのか知っています: CS =コードセグメント(IPに使用) DS =データセグメント(MOVに使用) ES =宛先セグメント(MOVSなどに使用) SS =スタックセグメント(SPに使用) しかし、以下のレジスタが何のために使用されることを意図していますか? FS = "ファイルセグメント"? GS = ??? 注:私は特定のオペレーティングシステムについて尋ねるのではなく、CPUが何のために使用することを意図していたかについて尋ねます。

5
x86アセンブリのレジスタで使用されるプッシュ/ポップ命令の機能は何ですか?
アセンブラについて読んでいると、プロセッサの特定のレジスタをプッシュし、後でもう一度ポップして以前の状態に戻すと書いている人によく出くわします。 どうすればレジスターをプッシュできますか?どこにプッシュされますか?なぜこれが必要なのですか? これは、単一のプロセッサ命令に要約されますか、それとももっと複雑ですか?

2
gdbの特定のアドレスでアセンブリ命令を中断するにはどうすればよいですか?
0x0000000000400448 <main+0>: push %rbp 0x0000000000400449 <main+1>: mov %rsp,%rbp 0x000000000040044c <main+4>: mov $0x6,%eax 0x0000000000400451 <main+9>: leaveq 0x0000000000400452 <main+10>: retq 私は試した: breaki 0x0000000000400448 しかし、そのようなコマンドはないようです。 gdbにはそのような機能がありますか?
96 assembly  gdb 

2
プロジェクトにアセンブリファイルが含まれている場合のmmapからの予期しないexec権限
これで頭を壁に打ちつけています。 私のプロジェクトではmmap、マッピング(/proc/self/maps)を使用してメモリを割り当てているときに、読み取り可能なメモリのみを要求したにもかかわらず、それが読み取り可能で実行可能な領域であることを示しています。 strace(見栄えは良かった)やその他のデバッグを調べたところ、この奇妙な問題を回避していると思われる唯一のこと、つまりプロジェクトからアセンブリファイルを削除し、純粋なCのみを残すことを特定できました(何ですか?)。 だからここに私の奇妙な例が​​あります、私はUbunbtu 19.04とデフォルトのgccに取り組んでいます。 ターゲットの実行可能ファイルをASMファイル(空)でコンパイルするとmmap、読み取り可能で実行可能な領域が返されます。ビルドしないと、正しく動作します。/proc/self/maps私の例に組み込んだ出力を参照してください。 example.c #include <stdio.h> #include <string.h> #include <sys/mman.h> int main() { void* p; p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0); { FILE *f; char line[512], s_search[17]; snprintf(s_search,16,"%lx",(long)p); f = fopen("/proc/self/maps","r"); while (fgets(line,512,f)) { if (strstr(line,s_search)) fputs(line,stderr); } fclose(f); } return 0; } example.s:空のファイルです! アウトプット ASM付属バージョン VirtualBox:~/mechanics/build$ gcc example.c …
94 c  linux  assembly  mmap 

5
EBPフレームポインターレジスタの目的は何ですか?
私はアセンブリ言語の初心者ですが、コンパイラーによって生成されたx86コードは、EBP他の何かのためにレジスターを使用できるリリース/最適化モードでも、通常フレームポインターを保持していることに気づきました。 フレームポインターがコードのデバッグを容易にする理由、およびalloca()関数内で呼び出された場合に必要になる理由を理解しています。ただし、x86には非常に少数のレジスターがあり、そのうちの2つを使用してスタックフレームの場所を保持する場合、私には意味がありません。最適化されたリリースやリリースビルドでも、フレームポインターを省略することが悪い考えと見なされるのはなぜですか?

3
GDBでスタックの内容を確認するにはどうすればよいですか?
私はGDBを初めて使用するので、いくつか質問があります。 スタックの内容を確認するにはどうすればよいですか?例:レジスターの内容を表示するには、と入力しinfo registersます。スタックの場合、それはどうあるべきですか? 内容を確認するにはどうすればよい$0x4(%esp)ですか?と入力するとprint /d $0x4(%esp)、GDBでエラーが発生します。 プラットフォーム:LinuxおよびGDB
94 c  assembly  gdb 

8
if(bool)またはif(int)のどちらが速いですか?
どちらの値を使用する方が良いですか?ブール値trueまたは整数1? 上記のトピックにより、私はいくつかの実験をbool行いintましたif。好奇心からこのプログラムを書きました。 int f(int i) { if ( i ) return 99; //if(int) else return -99; } int g(bool b) { if ( b ) return 99; //if(bool) else return -99; } int main(){} g++ intbool.cpp -S 次のように、各関数のasmコードを生成します。 asmコード f(int) __Z1fi: LFB0: pushl %ebp LCFI0: movl %esp, %ebp LCFI1: cmpl …
94 c++  assembly  int  boolean 

14
ワードとバイトの違いは何ですか?
私はいくつかの研究をしました。バイトは8ビットで、ワードはメモリ上でアドレス指定できる最小単位です。単語の正確な長さはさまざまです。私が理解していないのは、バイトを持つことの意味は何ですか?8ビットと言ってみませんか? 私は教授にこの質問をしたところ、最近のほとんどのマシンはバイトアドレス指定可能であると彼は言ったが、それは何を意味するのだろうか?

7
アセンブリ言語を学ぶ価値はありますか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? Stack Overflowのトピックとなるように質問を更新します。 9年前休業。 この質問を改善する ASMを学ぶ価値はまだありますか? 少しは知っていますが、実際に使用したり適切に学習したりはしていません。なぜなら、アセンブラーで習得したことはすべて、CやC ++などの言語で1/10の時間で実行できるからです。では、ASMを実際に学習して使用する必要がありますか?それは私に専門的に何か良いことをしますか?それは私の機知を高めますか?要するに、それは私をより良いプログラマーにしてくれるでしょうか? 注:HLA(高水準アセンブラー)のようなものではなく、FASMまたはNASMのような低水準のアセンブリについて話しています。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.