問題タブ [att]
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.
assembly - 命令の引数の順序
関数 main のアセンブラー コードのダンプ:
mov %rsp,%rbp
私は手段を学んだmove the value of rsp to rbp
しかし、私はインテルのアーキテクチャで、それは意味することを知っていたインテルmove the value of rbp to rsp
のマニュアル(Intel Architecture Software Developer's Manual. Volume 2. 3-104 MOV命令)によると、mov a, b
move b to a
次sub
の命令は同じです。sub a,b
私は手段を知っていたa = a-b
。しかし、ここでsub $0x30, %rsp
意味するのはrsp = rsp - 0x30
私がどうかしましたか、まずいことでもありましたか?
assembly - leal (%eax, %eax) は何をしますか?
何をしleal (%eax, %eax)
ますか?かっこがあるので、それは %eax * 2 で内容を乗算しますか?
assembly - AT&Tアセンブリで変数を正しく見つける方法は?
アセンブリを使用してブートストラップを作成する練習をしています (AT&T 構文と gnu/gas)。小さなプログラムが組み立てられてリンクされ、仮想ディスクの最初のセクターにコピーされます。BIOS はそれを にロードしますが0000:7c00
、ここで問題が発生します。は、実行中に からにcall hello
変換されます。しかし、は移転しません。は、まだありません。その結果、画面上で を作成できません。代わりに、ランダムなデータが画面に表示されます。call 0010
call 7c10
movw $message, %as
ax
0026
7c26
Hello World
0000:0026
起動時に正しくするにはどうすればよいですか? いくつかのディレクティブを使用して asm ソース コードを変更する必要がありますか? または、リンク スクリプトを変更する必要がありますか?
ありがとうございました!
次のアセンブルおよびリンク スクリプトを使用します。
assembly - x86 アセンブリの movl、intel-syntax
ちょっとした質問です。アセンブリでこれを行う方法があるかどうかは誰にもわかりますか?
私がやろうとしているのは、基本的に、スタックから次の引数 (固定サイズ) を追加するループを作成することです。
例:
x、y、z、および a をすぐにレジスタにロードする代わりに、最初の 2 つの条件が真であることが確実な場合にのみ、a をレジスタにロードできます。
p/s: その場でコードを書きましたが、実際には何も役に立ちません。
c - 「C」は 2 つの異なる値として表示されますか?
アセンブリで2つの異なる文字を比較しようとしています(Cプログラムでアセンブリ関数を呼び出しています)。char の 1 つは構造体に属し、もう 1 つは関数を呼び出すときに渡されます。
gdb でデバッグすると、%ebx は 83 ですが、10(%edi) は 21315 です。それらを文字として出力すると、どちらも「C」に見えます。21315 を 83 に変換する方法はありますか?
assembly - GASはレジスタ%ipを認識しません
私の16ビットプログラムでは、GASは次のような指示に呆然としています。
セグメントレジスタの移動は正常に機能するため、これは奇妙だと思います。たとえば、次のようになります。
完全なエラーメッセージは次のとおりです。
エラー:不正なレジスタ名 `%ip '
そして私のバージョン文字列は次のとおりです。
GNUアセンブラ(GNU Binutils)2.22
pointers - アセンブリのアスタリスク ポインター (I32 / x86)
問題のある行:
逆アセンブルされたコードの 804a400 の位置に命令はありません (私のリストは 804a247 で終わります)
そのメモリの場所にあるものを確認すると、次のようになります。
この jmp ステートメントは正確に何をしようとしているのでしょうか?
pointers - ポインタの値をアセンブリ内の別の新しいポインタにコピーする
更新:コードでstrcpyを使用できます。
x86アセンブリ(att構文)でstrdupの実装を記述し、CのコードをAssemblyのコードに変換しようとしています。
Cのコード:
アセンブリのコード:
コードを実行すると、char*の一部しか返されません。例:「StackOverflow」を渡すと「Stac @@#$$」になります。私はmovlで何か間違ったことをしていると思いますが、実際には何がわかりません。
p / s:私のstrlenはうまくいくと確信しています。
パート2:私が書いたコードは呼び出し元へのポインターを返しますか?後で割り当てたスペースを解放する機能のように。
arrays - 2次元配列に値を割り当てるときのガベージ値
私はアセンブリにまったく慣れていませんが、2次元の「配列」に値を割り当てるときに問題が発生しました。私の配列は.space
名前が付けられscreen
ており、が割り当てられてHEIGHT * WIDTH * 4
いるため、十分なスペースがあります。
以下のコマンドを実行する前に、配列には値のみが含まれています(以下のコマンドを発行する前に、配列をループしてすべての値をに設定し、すべての値を出力して検証した0
ため、これを知っています)。0
これが私がすることです:
そして、これが結果になります(すべての行と列をリストする場合):
私が期待していたのは、screen[0][1]
:の変化を見ることだけでしたx:0 y:1 value:20
。これらの「ガベージ」値(、、など)の原因は335544320
何1310720
ですか5120
?
私が言ったように、私は完全な初心者なので、いい人になりましょう!
編集: ゼロフィル関数と配列内のすべての値を一覧表示する関数を提供しています。
編集2:アンドレアスからの入力の後、私はこの関数を作成しました:
編集3 まだ正しくないことがあります。今これを行うとき:
私は(3x3配列)を取得します:
assembly - mov %eax,(%esp)
次のステートメントの違いは何ですか?
私はバイナリ爆弾の拡散に取り組んでおり、アセンブリの早い段階でコマンド mov
とコマンドのいくつかに問題があります。leal