指示
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して、そこでバイトにアクセスする必要があることを意味します。