0

Visual Studio のインライン アセンブラに問題があり、正しい値が読み込まれていないようです。次のように C 文字列を宣言します。

const char* str = "1235";  

次に、asm で次のように文字列にアクセスします。

movzx ebx, byte ptr str[esi]

問題は、49 を ebx ('1' の ascii コード) にロードする代わりに 0 をロードすることです。大規模なデバッグにより、esi が正しいインデックスであると確信しています。文字列を間違ってロードしていますか?

4

2 に答える 2

4

指示

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変数の一部を読み取るバイトを読み取ろうとしていますstresiが3より大きい場合は、の終わりを超えて読んでいますstr

あなたが実際にやりたいことは、str指し示すことを読むことです。これはstr、レジスター(私が選択したebx)にロードし、結果に追加esiして、そこでバイトにアクセスする必要があることを意味します。

于 2013-03-03T22:07:51.953 に答える
0

試す:

movzx     ebx, byte ptr str[esi]
于 2013-03-02T05:07:11.157 に答える