指示
movzx ebx, byte ptr str[esi]
esi
の開始後のバイトであるバイトを読み取るように言いますstr
。これは、同等のアセンブリ言語です。
ebx = *(unsigned char*)(&str) + esi);
あなたの場合、str
はポインタ変数であり、ポインタstr[0]
の下位8ビット、str[1]
ビット8〜15、str[2]
ビット16〜23、str[3]
ビット24〜31です。の一部ではないメモリを読み取っているため、3より大きい値はバッファオーバーフローですstr
。
str
変数をレジスタにロードし、そのレジスタからインデックス付きアドレス指定を行うために実際に実行したいこと。
mov ebx, str
movzx ebx, byte ptr [ebx+esi]
写真で:
+----+
1003 | 12 |
+----+
1002 | 34 |
+----+
1001 | 56 |
+----+
str 1000 | 78 |
+----+
+----+
1234567D | 00 |
+----+
1234567C | 45 |
+----+
1234567B | 44 |
+----+
1234567A | 43 |
+----+
12345679 | 42 |
+----+
12345678 | 41 |
+----+
str+esi
変数の一部を読み取るバイトを読み取ろうとしていますstr
。esi
が3より大きい場合は、の終わりを超えて読んでいますstr
。
あなたが実際にやりたいことは、str
指し示すことを読むことです。これはstr
、レジスター(私が選択したebx
)にロードし、結果に追加esi
して、そこでバイトにアクセスする必要があることを意味します。