0

重複の可能性:
x86 を小文字のアセンブリに変換

このプログラムは、2D char 配列を小文字に変換するものです Quickie Edit: Visual Studio 2010 を使用しています

int b_search (char list[100][20], int count, char* token)
{
__asm
{
    mov eax, 0          ; zero out the result
mov esi, list       ; move the list pointer to ESI
mov ebx, count      ; move the count into EBX
mov edi, token      ; move the token to search for into EDI 
MOV ecx, 0

LOWERCASE_TOKEN:            ;lowercase the token
OR [edi], 20h
INC ecx
CMP [edi+ecx],0
JNZ LOWERCASE_TOKEN
MOV ecx, 0

トークンへのアドレスを含むレジスタをすべて小文字に変更しようとしている OR 命令で、未処理の例外が発生し続けます...アクセス違反が発生し、括弧がないと何も小文字になりません。後で私のコードで私が持っている

LOWERCASE_ARRAY:        ;for(edi = 0, edi<ebx; edi++), loops through each name
CMP ecx, ebx
JGE COMPARE
INC ecx             ;ecx++
MOV edx, 0;         ;edx = 0

LOWERCASE_STRING:       ;while next char != 0, loop through each byte to convert to lower case
OR [esi+edx],20h    ;change to lower case
INC edx
CMP [esi+edx],0     ;if [esi+edx] not zero, loop again
JNZ LOWERCASE_STRING
JMP LOWERCASE_ARRAY ;jump back to start case change of next name

そこのOR指示は完全に機能しているように見えるので、最初の指示が機能しない理由がわかりません。また、いくつかの文字列を変換しようとしています。

1 つの文字列を終了した後、次の文字列に移動する方法についてのアイデア ( list[1][x]list[2][x]など) のように 20 を追加しようとしまし[esi+20*ecx+edi]たが、うまくいきません。進め方についてアドバイスをもらえますか?

4

1 に答える 1

0

1 つの可能性:

プロシージャーのパラメーターがb_searchレジスターとして保管されている場合 (レジスター呼び出し規約)、最初の asm 行でポインターをオーバーライドします。これは、eax が配列listを指しているためです。list

mov eax, 0          ; zero out the result

なぜなら:

mov esi, list       ; move the list pointer to ESI

次のように変換する必要があります。

mov esi, eax

1 行目と 2 行目を次のように入れ替えてみてください。

mov esi, list       ; move the list pointer to ESI
mov eax, 0          ; zero out the result
于 2012-07-25T16:44:03.477 に答える