問題タブ [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.

0 投票する
1 に答える
1140 参照

assembly - YASM がキーワード「オフセット」を認識しないのはなぜですか?

私は天国の門をコンパイルしようとしています:

以下のコードで:

しかし、YASMは私に言います:

offsetキーワードじゃない?このエラーが発生するのはなぜですか?

0 投票する
2 に答える
2119 参照

linux - アセンブリ:retを介して戻るラベルにジャンプすると、セグメンテーション違反が発生するのはなぜですか?

Linuxアセンブリチュートリアルには次のように記載されています。

覚えておくべき非常に重要なことが1つあります。(RET命令を使用して)プロシージャから戻ることを計画している場合は、それにジャンプしないでください。「決して!」のように これを行うと、Linuxではセグメンテーション違反が発生します(これは問題ありません。プログラムが終了するだけです)が、DOSでは、さまざまな程度の恐ろしさで顔を爆破する可能性があります。

しかし、なぜそれがセグメンテーション違反を引き起こすのか理解できません。関数から戻るように聞こえます。

「Xが発生した場合は、プロシージャAを呼び出します。それ以外の場合は、プロシージャBを呼び出します」というロジックを実装する必要がある状況があります。カンガルー織りのスパゲッティコードのように飛び回る以外の方法はありますか?

0 投票する
1 に答える
242 参照

windows - yasm を使用して MS Windows のコンソールに書き込むにはどうすればよいですか?

このコードを(割り込みを使用して)試しましたが、DOS用です:

0 投票する
6 に答える
81459 参照

c - デバッグなしで不正な命令エラーを引き起こしたアセンブリ命令を見つける

アセンブリで記述したプログラムを実行すると、Illegal instructionエラーが発生します。私が実行しているマシンにはデバッガーや開発システムがないため、デバッグせずにエラーの原因となっている命令を知る方法はありますか? つまり、あるマシンでコンパイルし、別のマシンで実行します。SSE4.2 をサポートしていないため、コンパイルしているマシンでプログラムをテストできません。私がプログラムを実行しているマシンは、それでも SSE4.2 命令をサポートしています。

-msse4.2フラグを渡してgccで行うのと同じように、アセンブラ(YASM)にSSE4.2命令を認識するように指示する必要があるためだと思います。それともそれが理由ではないと思いますか?YASM に SSE4.2 命令を認識させる方法はありますか?

おそらく、 SIGILLシグナルをトラップしてから、SA_SIGINFO をデコードして、プログラムが行う不正な操作の種類を確認する必要があります。

0 投票する
4 に答える
25564 参照

assembly - YASM/NASM x86 アセンブリでの即値と角括弧の基本的な使用法

次の宣言があるとします。

これらの手順は、次のsection .textとおりです。

bl には値 5 が含まれ、cl には変数のメモリ アドレスが含まれることを理解するのは正しいbufferですか?

の違いについて混乱しています

  • イミディエイトをレジスタに移動し、
  • レジスターを即値に移動する (何が入るか、データまたはアドレス?)
  • 括弧なしで即値をレジスターに移動する
    • たとえば、mov cl, buffermov cl, [buffer]

更新: 回答を読んだ後、次の要約が正確であると思います。

  • mov edi, array0 番目の配列インデックスのメモリ アドレスを に入れますedi。つまり、ラベル アドレスです。
  • mov byte [edi], 3値 3 を配列の 0 番目のインデックスに入れます
  • の後add edi, 3edi配列の 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をリンクしています)

0 投票する
2 に答える
1481 参照

assembly - x86NASMまたはYASMアセンブリで選択ソートを実装する際の問題

64ビットLinuxで実行されるNASMで選択ソートの配列を実装しようとしています。

配列は次のように宣言されます。

ソートアルゴリズム自体は非常に単純ですが、使用可能なレジスタの数と、イミディエート(つまりブラケット)を交換できないという2つの点で制限されていると感じています。

並べ替えられていない配列の境界、そのインデックス、現在の最小値の場所、およびそのインデックスを追跡する必要があります。これはすでに4つのレジスタです。また、2つのループカウンターを追跡する必要があります。1つはソートされていない配列境界を表す外側のループ用で、もう1つは各パスの反復用(つまり内側のループ)です。これはさらに2つ、合計6つのレジスタです。

mov [var1], [var2]2つの要素を交換する必要があるときはいつでも、一時的なプレースホルダーとしてレジスターを使用する必要があるなど、イミディエートを相互に移動することはできません。これは、どのレジスタがどの情報を保持しているかを追跡するという点で、すぐに扱いにくくなります。

以下はこれまでの私の試みです。これは、セグメンテーション違反を引き起こす機能しないコードであることに注意してください。しかし、おそらくあなたは私がやろうとしていることを理解し、私のアプローチがどこで間違っているのかを指摘することができます。

.IFや.ELSEを提供するマクロなど、構成を単純化するマクロは使用したくありません。

0 投票する
2 に答える
2220 参照

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とリンクできる必要があります。

0 投票する
2 に答える
1834 参照

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出力

0 投票する
1 に答える
339 参照

assembly - 間接アドレス指定された値をALに移動することは機能しますが、8ビットrXbレジスタに移動することはyasmでは機能しません

.dataで宣言された文字のバイト配列があります

そして、この配列のベースインデックスを指すようにrdiを設定しました

ある時点で、配列の文字を8ビットレジスタに入れたいと思います。void以下の最初のステートメントは有効な値を生成しますが、2番目のステートメントはgdbコマンドを入力するとr9bに含まれますprint $r9b

レジスタr8bからr15bのいずれも同じ効果があります。私が理解しているように、とは両方ともal8r9bビットですが、なぜ一方が機能し、もう一方が機能しないのですか?私の勘では、どちらも8ビットのサイズですが、微妙な違いがあり、私にはわかりません。

Intelのドキュメントには次のように記載されています。

「REXプレフィックスは、64ビットのオペランドサイズまたは参照レジスタR8〜R15を生成するために使用されます。」

これは私の問題に関連していますか?

0 投票する
5 に答える
18236 参照

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 が見つからないのはなぜですか?