問題タブ [yasm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - アセンブリ:retを介して戻るラベルにジャンプすると、セグメンテーション違反が発生するのはなぜですか?
Linuxアセンブリチュートリアルには次のように記載されています。
覚えておくべき非常に重要なことが1つあります。(RET命令を使用して)プロシージャから戻ることを計画している場合は、それにジャンプしないでください。「決して!」のように これを行うと、Linuxではセグメンテーション違反が発生します(これは問題ありません。プログラムが終了するだけです)が、DOSでは、さまざまな程度の恐ろしさで顔を爆破する可能性があります。
しかし、なぜそれがセグメンテーション違反を引き起こすのか理解できません。関数から戻るように聞こえます。
「Xが発生した場合は、プロシージャAを呼び出します。それ以外の場合は、プロシージャBを呼び出します」というロジックを実装する必要がある状況があります。カンガルー織りのスパゲッティコードのように飛び回る以外の方法はありますか?
windows - yasm を使用して MS Windows のコンソールに書き込むにはどうすればよいですか?
このコードを(割り込みを使用して)試しましたが、DOS用です:
c - デバッグなしで不正な命令エラーを引き起こしたアセンブリ命令を見つける
アセンブリで記述したプログラムを実行すると、Illegal instruction
エラーが発生します。私が実行しているマシンにはデバッガーや開発システムがないため、デバッグせずにエラーの原因となっている命令を知る方法はありますか? つまり、あるマシンでコンパイルし、別のマシンで実行します。SSE4.2 をサポートしていないため、コンパイルしているマシンでプログラムをテストできません。私がプログラムを実行しているマシンは、それでも SSE4.2 命令をサポートしています。
-msse4.2
フラグを渡してgccで行うのと同じように、アセンブラ(YASM)にSSE4.2命令を認識するように指示する必要があるためだと思います。それともそれが理由ではないと思いますか?YASM に SSE4.2 命令を認識させる方法はありますか?
おそらく、 SIGILLシグナルをトラップしてから、SA_SIGINFO をデコードして、プログラムが行う不正な操作の種類を確認する必要があります。
assembly - YASM/NASM x86 アセンブリでの即値と角括弧の基本的な使用法
次の宣言があるとします。
これらの手順は、次のsection .text
とおりです。
bl には値 5 が含まれ、cl には変数のメモリ アドレスが含まれることを理解するのは正しいbuffer
ですか?
の違いについて混乱しています
- イミディエイトをレジスタに移動し、
- レジスターを即値に移動する (何が入るか、データまたはアドレス?)
- 括弧なしで即値をレジスターに移動する
- たとえば、
mov cl, buffer
対mov cl, [buffer]
- たとえば、
更新: 回答を読んだ後、次の要約が正確であると思います。
mov edi, array
0 番目の配列インデックスのメモリ アドレスを に入れますedi
。つまり、ラベル アドレスです。mov byte [edi], 3
値 3 を配列の 0 番目のインデックスに入れます- の後
add edi, 3
、edi
配列の 3 番目のインデックスのメモリ アドレスが含まれるようになりました mov al, [array]
0 番目のインデックスの DATA を にロードしますal
。mov al, [array+3]
3 番目のインデックスの DATA を にロードしますal
。mov [al], [array]
x86 は 2 つの明示的なメモリ オペランドをエンコードできず、al
は 8 ビットしかなく、16 ビット アドレッシング モードでも使用できないため、無効です 。メモリ位置の内容を参照します。(x86 アドレッシング モード)mov array, 3
は無効です。「格納されているオフセットが気に入らないarray
ので、3 と呼びます」とは言えないからです。即値は、ソース オペランドのみにすることができます。mov byte [array], 3
値 3 を配列の 0 番目のインデックス (最初のバイト) に入れます。 指定子は、メモリ、即値オペランドを使用する命令のバイト/ワード/dword 間のあいまいさを回避するために必要です。byte
そうしないと、アセンブル時のエラー (あいまいなオペランド サイズ) になります。
これらのいずれかが間違っている場合は言及してください。(編集者注:構文エラー/あいまいさを修正したため、有効なものは実際には有効なNASM構文です。詳細については、他のQ&Aをリンクしています)
assembly - x86NASMまたはYASMアセンブリで選択ソートを実装する際の問題
64ビットLinuxで実行されるNASMで選択ソートの配列を実装しようとしています。
配列は次のように宣言されます。
ソートアルゴリズム自体は非常に単純ですが、使用可能なレジスタの数と、イミディエート(つまりブラケット)を交換できないという2つの点で制限されていると感じています。
並べ替えられていない配列の境界、そのインデックス、現在の最小値の場所、およびそのインデックスを追跡する必要があります。これはすでに4つのレジスタです。また、2つのループカウンターを追跡する必要があります。1つはソートされていない配列境界を表す外側のループ用で、もう1つは各パスの反復用(つまり内側のループ)です。これはさらに2つ、合計6つのレジスタです。
mov [var1], [var2]
2つの要素を交換する必要があるときはいつでも、一時的なプレースホルダーとしてレジスターを使用する必要があるなど、イミディエートを相互に移動することはできません。これは、どのレジスタがどの情報を保持しているかを追跡するという点で、すぐに扱いにくくなります。
以下はこれまでの私の試みです。これは、セグメンテーション違反を引き起こす機能しないコードであることに注意してください。しかし、おそらくあなたは私がやろうとしていることを理解し、私のアプローチがどこで間違っているのかを指摘することができます。
.IFや.ELSEを提供するマクロなど、構成を単純化するマクロは使用したくありません。
assembly - yasmで作成されたアセンブリコードのデバッグ
64ビットLinuxでyasmを使用してアセンブルされたasmコード用の優れたデバッガーを見つけて使用するためのサポートが必要です。gdbデバッガーは、シンボルテーブルがロードされていないと文句を言い続けます。stackoverflowの誰かが、-dstabsスイッチを使用してアセンブルすることを提案しましたが、それは私にとっては何の違いもありません。dddも違いはありません。
「シンボルテーブルがロードされていない」問題を取り除く方法を見つけることができれば、gdbはそれほど悪くはないでしょう。また、レジスターやその他の宣言の内容を表示できる必要があります。
を使用してasmファイルをアセンブルしyasm -f elf -m amd64 file.asm
、とリンクしld file.o -o file
ます。スイッチを使用してyasmで.lstファイルを作成する-l
ことも機能しないようです。
この問題に関して私が見つけたすべてのアドバイスは、ldではなくgccをリンカーとして使用することに関連しているようです。ldとリンクできる必要があります。
assembly - NASMアセンブリコードのセグメンテーション違反
私のアセンブラーはYASMで、64ビットLinuxでコーディングしています。
ldを使用して組み立てyasm -f elf -m amd64 -g dwarf2 filename.asm
、ldを使用してリンクします
選択ソートを実装しようとしています。rdi
配列のさまざまな部分をrsi
指していstrbuf2 resb 10
ます。このセグメンテーション違反の理由は何でしょうか?行105と行106はまったく同じタイプの操作を実行しますが、行106ではクラッシュするのに行105ではクラッシュしないのはなぜですか?
コードの関連部分と、クラッシュしたときのgdbtuiスクリーンショットを含めました。
更新:カウンターが修正されました
セグメンテーション違反のgdb出力
assembly - 間接アドレス指定された値をALに移動することは機能しますが、8ビットrXbレジスタに移動することはyasmでは機能しません
.dataで宣言された文字のバイト配列があります
そして、この配列のベースインデックスを指すようにrdiを設定しました
ある時点で、配列の文字を8ビットレジスタに入れたいと思います。void
以下の最初のステートメントは有効な値を生成しますが、2番目のステートメントはgdbコマンドを入力するとr9bに含まれますprint $r9b
。
レジスタr8bからr15bのいずれも同じ効果があります。私が理解しているように、とは両方ともal
8r9b
ビットですが、なぜ一方が機能し、もう一方が機能しないのですか?私の勘では、どちらも8ビットのサイズですが、微妙な違いがあり、私にはわかりません。
Intelのドキュメントには次のように記載されています。
「REXプレフィックスは、64ビットのオペランドサイズまたは参照レジスタR8〜R15を生成するために使用されます。」
これは私の問題に関連していますか?
linux - インストールしたのに yasm が見つからない
奇妙な問題が発生しました。x264をインストールしてみました。sudo ./configure --enable-shared を実行すると、次のようになりました。
アセンブラが見つかりません 最小バージョンは yasm-0.7.0 です 本当に asm なしでコンパイルしたい場合は、--disable-asm で設定してください。
しかし、私はすでに yasm-0.7.0 をインストールしていることを証明するために、yasm --version を実行しました。
* yasm 0.7.0.2066 2012 年 5 月 8 日にコンパイル。Copyright (c) 2001-2008 Peter Johnson およびその他の Yasm 開発者。ライセンスの概要と概要については、yasm --license を実行してください。*
yasm を /usr/local/yasm にインストールしましたが、yasm が見つからないのはなぜですか?