-1

charポインタを小文字に変換するプログラムです。Visual Studio 2010 を使用しています。

これは別の質問からのものですが、読みやすく、より直接的です。

int b_search (char* token)
{
__asm
{
mov eax, 0          ; zero out the result
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命令で、未処理の例外が発生し続けます...アクセス違反が発生し、括弧なしではエラーは発生しませんが、何も発生しません小文字になります。何かアドバイス?これは別の質問のより大きなコードの一部ですが、このソリューションのみが必要だったため、分割しました。

4

3 に答える 3

0

問題は、他の多くの演算子と同様に、OR 演算子が 2 つのメモリまたは定数パラメーターを許可しないことです。つまり: OR 演算子は、次のパラメーターのみを持つことができます。

OR register, memory
OR register, register
OR register, constant

2 番目の問題は、OR が結果をメモリではなくレジスタに格納する必要があることです。括弧が設定されていると、アクセス違反が発生するのはそのためです。ブラケットを削除すると、パラメーターは問題ありませんが、小文字をメモリに書き込みません。これは、意図したことです。そのため、別のレジスタを使用して文字をコピーし、OR を使用します。例えば:

mov eax, 0          ; zero out the result
mov edi, [token]      ; move the token to search for into EDI 
MOV ecx, 0
LOWERCASE_TOKEN:            ;lowercase the token
MOV ebx, [edi]        ;## Copy the value to another register ##
OR ebx, 20h         ;## and compare now the register and the memory ##    
MOV [edi], ebx      ;##Save back the result ##    
INC ecx    
CMP [edi+ecx],0    
JNZ LOWERCASE_TOKEN    
MOV ecx, 0

それはうまくいくはずです^^

于 2013-06-01T14:38:50.683 に答える
0

コードで変更できるのは最初の文字 (または [edi]、20h) のみです。EDI は増加しません。

編集:回避策のあるこのスレッドが見つかりました。al の代わりに 'dl' を使用してみてください。

; move the token address to search for into EDI
; (not the *token, as would be with mov edi, [token])

mov edi, token      

LOWERCASE_TOKEN:            ;lowercase the token
  mov al, [edi]
  ; check for null-terminator here !
  cmp al, 0
  je GET_OUT
  or al, 20h
  mov dl, al
  mov [edi], dl
  inc edi
jmp LOWERCASE_TOKEN
GET_OUT:
于 2012-07-25T19:15:31.443 に答える
0

データをレジスタにロードし、そこで操作してから、結果をメモリに保存します。

int make_lower(char* token) {
    __asm {
        mov edi, token
        jmp short start_loop
    top_loop:   
        or al, 20h
        mov [edi], al
        inc edi
    start_loop:
        mov al, [edi]
        test al, al
        jnz top_loop
    }       
}

ただし、大文字への変換には多少の欠陥があることに注意してください。たとえば、入力に制御文字が含まれている場合、それらは別のものに変更されますが、それらは大文字ではなく、変換後の文字も小文字にはなりません。

于 2012-07-25T20:53:06.773 に答える