私はアセンブリで特定のタスクを達成する方法を自分自身で教えようとしています。トラブル理解レジスタx86
今、私は回文を検出しようとしています。私は、スタックを使用するか、おそらくアーバインのライブラリを使用して文字列を比較することができます知っているが、私はレジスタを介してそれをやろうとしている。
問題は、レジスタを使用する場合、私はちょっと混乱しています。
以下のコンパイルが、私はCMPラインを取得、プログラムブレークと私にこのメッセージを与える:Project.exeで0x004033FCで
未処理の例外:0xc0000005で:アクセス 違反読み取り場所0x0000000Fを。
私はレジスタをどのように設定するかとは関係がありますが、デバッグ中はレジスタを使用していてもそれほど助けにはならないと思います。
ご協力いただければ幸いです。
INCLUDE Irvine32.inc
.data
enteredWord BYTE "Please enter the string to check: ", 0
presetWord BYTE "Step on no pets", 0
isAPalindrome BYTE "The word is a palindrome. ", 0
isNotAPalindrome BYTE "The word is not a palindrome. ", 0
.code
main proc
mov ecx, SIZEOF presetWord - 1
mov esi,OFFSET presetWord
checkWord:
MOV eax,[esi]
CMP [ecx],eax
JNE NOTPALIN
inc esi
dec ecx
loop checkWord
mov edx, offset isAPalindrome
call WriteString
jmp _exit
main endp
NOTPALIN PROC
mov edx, offset isNotAPalindrome
call WriteString
ret
NOTPALIN endp
_exit:
exit
end main
'ecx'をポインタとして使用しましたが、代わりに長さを指定してロードしました。また、1バイトではなく4バイトずつ操作します。 'mov al、[esi];を使用します。 cmp [presetWord + ecx]、代わりにalです。 – Jester
'ECX'を*文字数*に設定すると、それをメモリへのポインタとして使用します。それは妥当な何かを指摘しませんので、もちろんクラッシュします。長さだけでなく、長さをオフセットするために 'ECX'を設定する必要があります。 –
@Jesterそれで、私はまだ 'mov ecx、OFFSET presetWord + SIZEOF presetWord - 1'をしなければならないでしょうか? –