70

次のコードが与えられます:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1

の括弧は何を[L1]表していますか?


この質問は特にNASMに関するものです。Intel構文アセンブリのもう1つの主要なフレーバーは、MASMスタイルです。このスタイルでは、レジスターが含まれていない場合、ブラケットの動作が異なります。MASM32のブラケットの混乱
を参照してください。

4

9 に答える 9

59

[L1]アドレスL1のメモリの内容を意味します。mov al, [L1]ここで実行した後、alレジスタはアドレスL1のバイト(文字「w」)を受け取ります。

于 2010-01-08T20:06:31.783 に答える
54

などのこのタイプのオペランドは、メモリオペランド[ebp]と呼ばれます。

ここでのすべての答えは良いですが、これを厳格なルールとして従う際の警告については何も教えていないことがわかります-括弧の場合は、命令である場合を除いてlea、逆参照します。

lea上記の規則の例外です。私たちがやったと言う

mov eax, [ebp - 4]

の値はebp4で減算され、括弧は結果の値がアドレスとして取得され、そのアドレスにある値がに格納されることを示しますeax。ただし、leaの場合、角かっこは次のことを意味するわけではありません。

lea eax, [ebp - 4]

の値はebp4で減算され、結果の値はに格納されeaxます。この命令は、アドレスを計算し、計算された値をデスティネーションレジスタに格納するだけです。MOVとLEAの違いは何ですか?を参照してください。詳細については。

于 2014-09-13T14:20:20.337 に答える
30

単にラベルL1でマークされたアドレスでメモリを取得することを意味します。

Cが好きなら、次のように考えてください[L1]*L1

于 2010-01-08T20:11:14.880 に答える
11

角かっこは、アドレスの参照を解除することを意味します。例えば

mov eax, [1234]

つまり、アドレス1234の内容をEAXに移動します。それで:

1234 00001

EAXには00001が含まれます。

于 2010-01-08T20:06:55.747 に答える
2

直接メモリアドレス指定-alメモリアドレスにある値がロードされますL1

于 2010-01-08T20:08:42.980 に答える
1

多くのアセンブラ言語と同様に、これは間接参照を意味します。つまり、最初のmovロードには、アドレスではなく、 (つまりバイト)al内容がロードされます。L1'w'

2番目movは実際にアドレスをロードeaxし、後でそのアドレス L1を逆参照してそのコンテンツを取得または設定できます。

どちらの場合も、L1概念的にはアドレスと見なされます。

于 2010-01-08T20:07:07.557 に答える
1

これは、レジスタまたは数値をレジスタに移動する代わりにL1alレジスタ値または数値L1をメモリへのポインタとして扱い、そのメモリアドレスの内容をフェッチし、その内容をに移動することを意味しalます。

この場合、L1はメモリ位置ですが、レジスタ名が角かっこで囲まれている場合も同じロジックが適用されます。

mov al, [ebx]

負荷とも呼ばれます。

于 2010-01-08T20:07:29.350 に答える
0

これは、レジスタ自体に作用するのではなく、レジスタを実際の場所へのポインタとして使用する必要があることを示しています。

于 2010-01-08T20:07:34.560 に答える
0

MASMでは、ブラケットをレジスタとともに使用するとNASMのように機能し、その場合はオプションではありません。(レジスタを含まないアドレッシングモードでは、状況が異なります。MASM32の紛らわしい角かっこを参照してください) 。

括弧は、レジスターにポインターが含まれていること、およびマシン・コードがそのポインターの値を必要としていることを示します(ポインターはバイトアドレス指定にあります。ポインターはメモリーのx番目のバイトです。バイトは8桁の2進数です。1桁の16進数は4です。 2進数;バイトは2つの16進数であるため、そこから開始します); 命令のsrc部分にある場合。

  • ただし、dstに角かっこが含まれている場合、そのアドレスのメモリは命令のオペランドです。(以前に説明した「バイトアドレス指定」のポインタのようなメモリ。)

バイナリマシンコードでは(notepad.exeで16進数を入力してから、16進数を\ xhexadecimal result〜python_referenceに変換します)、レジスタ内のポインタの値を取得します。これは、実行中の命令のModR/Mバイトで定義できます。私が信じている10文字であるnotepad.exeで書かれること。(最初にMASMの経験を終えてから、ウィンドウのカーネル/マルウェア分析を読んで、notepad.exeに入力する内容に関する情報を収集します。この投稿に戻って、例)

1 .686
2 .model flat, c
3 option casemap :none
4 
5 include C:\masm32\include\kernel32.inc
6 includelib C:\masm32\lib\kernel32.lib
7 
8 .data 
9     message db "Hello world!", 0
10 .code
11 
12 main proc
13  call testfunc
14  COMMENT @ 
15  push 0FFFFh
16  push testfunc
17  pop ax
18  @
19  invoke ExitProcess, 404
20 main ENDP
21 
22 testfunc proc
23  sub esp, 1
24  mov al, 0FFh
25  mov [esp], al
26  COMMENT @
27  push 0FFFFh
28  push 05EFFB880h
29  push 0773BFF5Ch
30  push 0FB038Fh
31  mov al, [esp+8]
32  @
33  invoke ExitProcess, [esp]
34 testfunc ENDP
35 
36 END main

Windows:
これを実行した結果を入力して比較する場合:

C:\ masm32 \ bin \ ml / c / Zd /coff script_name.asm
C:\ masm32 \ bin \ Link /SUBSYSTEM:CONSOLE script_name.obj
script_name.exe
echo%ERRORLEVEL%

プログラムの終了ステータス(で出力される)は、ExitProcessへの引数としてechoスタックメモリに格納された数値であり、16進数のFFで終わります。mov [esp], al%ERRORLEVEL%数値を16進数ではなく、10進数の文字列に変換しますが、同じ数値です。)

ただし、[]がない場合[esp]:ALをEAXに変更する必要もあります(x86 CPUには8ビットレジスタを32ビットレジスタの一番下に移動する命令がないため)。そして、最後にコード行で文字「esp」が使用されたときの角かっこを削除します。これにより、espのスタック領域へのポインタが生成されます。

1 testfunc proc
2   mov eax, esp
3   mov bl, 0FFh
4   mov [eax], bl
5   COMMENT @
6   push 0FFFFh
7   push 05EFFB880h
8   push 0773BFF5Ch
9   push 0FB038Fh
10  mov al, [esp+8]
11  @
12  invoke ExitProcess, [esp]
13 testfunc ENDP

タグ:オプションのブラケット

上記のコードは、マシンコードをバイトではなく読み取り可能な方法に解釈し、Windowsカーネルがどのように実行されるかを知っている言語で、ブラケットが常に機能することを証明しています(コード内の値をポインターとして使用し、ポインターの値を取得します) exeファイル(リバースエンジニアリングウィンドウのカーネルを使用して、メモ帳内で独自のexeファイルを最初から作成します。これは十分なサポートがありませんが、マルウェア分析には十分なサポートがあります。)

(コードをテストする場合:最後のコードで行をtestfuncに置き換え、同じ方法で行を実行します):この場合、eaxはスタックセグメント(スタックセグメント)のメモリ内のespのポインターと同じです。独自の命令(イミディエート、レジスタ、またはメモリオペランドへの/からのPUSHおよびPOP 32ビット値)があるため、重要です。したがって、これを実行する場合、ベアespオペランドはESPレジスタの値であり、スタック上のメモリの内容ではなく、ポインタ値です。


たまに戻ってこの投稿を編集します(実際にアセンブリが上手になった場合)。したがって、これは組み立ての究極のガイドになります。アセンブリを始めたばかりで、アセンブリの特定の範囲のスクリプトで最上位ビットファインダーをすばやく作成しました。

これまでにこのスクリプトを作成するのに役立ったリソース
:C ++全体の5時間のチュートリアル:

  • https://www.youtube.com/watch?v=vLnPwxZdW4Y&ab_channel=freeCodeCamp.org

    この後、HTML / CSS / JSを学習し、計算機のWebサイトを作成するスカベンジャーハントを行うことをお勧めします(HTMLファイルをMicrosoftEdgeにドラッグアンドドロップします) )、Undertale(HTMLファイルをMicrosoft Edgeにドラッグアンドドロップ)のようなビデオゲームをコーディングするスカベンジャーハント、そして冗談のためだけにPython3を学びます。

DWORDのようなもの(unsigned long)を見つけるのに役立ちます。
https://www.bing.com

  • Intelソフトウェア開発者マニュアルを読んでください。メモリ内の位置を変更すると、高度なプログラマブル割り込みコントローラのコマンドレジスタと呼ばれ、CPUである別のコアでコードを実行する方法などが説明されています。覚えておく必要はありません。すべてをtxtに書き直してから、txtを作成する新しいセクションごとに単語を検索するスクリプトを作成することをお勧めします。私は本から何も覚えていませんでした、私は私の心の常識的な部分でいくつかのことを知っているだけです、あなたが読者のためにもっと知っていることを願っています。

第3巻の半分まで読み、残りをざっと読みました
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

  • チャプターをやっていて、それを読む間に30日間の休憩があったので、 https://www.youtube.com/c/WhatsACreelのビデオをいくつか見ました。私もそうすることをお勧めしますが、いつ停止するかを教えて、ビデオを見るという考えに疑問を投げかける方法がわかりません。ごめんなさい。

Davy Wybrialのアセンブリ言語チュートリアルは、すべての視聴後に視聴でき ます。https
://www.youtube.com/watch?v=wLXIWKUWpSs&ab_channel=DavyWybiral 「操作セクション」と呼ばれるIntelソフトウェア開発者マニュアルのセクション:

  • 「括弧で囲まれたレジスタ名は、そのレジスタにアドレスが含まれている場所の内容を意味します。」

Windowsでコーディングアセンブリを開始する方法(MASM)
https://www.youtube.com/watch?v=lCjbwLeLNfs&ab_channel=CharlesClayton

繰り返しになりますが、私はここ(この投稿と今後の投稿)に戻って、すべての人を教育しようとします。そのため、私の知識はすべての人が読んでいるのと同じです。

于 2022-02-22T22:37:28.653 に答える