私はまだ組み立てが新しく、今夜だけでも多くのことを間違っているかもしれないが、大部分を理解し始めていますが、私は経験不足のためにどこにいるのかを教えてくれました。間接アドレッシングを使用してx86アセンブリの文字列をコピー
x86アセンブリの間接アドレッシングを使用して、ソースからターゲットに文字列をコピーしようとしています。私はこの説明から私が理解していることを適用しようとしていますが、ediにデータ@ esiをどのように正確にコピーするのかを理解するのには苦労しています。
.data
val1 BYTE 10h,20h,30h
.code
mov esi,OFFSET val1
mov al,[esi] ; dereference ESI (AL = 10h)
inc esi
mov al,[esi] ; AL = 20h
inc esi
mov al,[esi] ; AL = 30h
これは(!!!)私がこれまで行ってきたと私は実際にそれを実行するために得ているものですが、残念ながらそれはまったくコピーされません。私は私のループが悪いと思われる(私はそれを正しく終了し正確かどうかはわかりません)、私のコピーで起こって狂った何かがありますが、私は間違っているつもりですどこ私は知らない。
INCLUDE Irvine32.inc
.data
source BYTE "Source string I want to copy",0
target BYTE SIZEOF source DUP(0)
.code
main PROC
mov esi,OFFSET source
mov edi,OFFSET target
L1:
mov al,[esi] ; get char from source
mov [edi],al ; store it in target
inc esi ;move to next char in source
inc edi ;move to next position in target
cmp al, 28 ;compare al to 28 (the number of chars in source string)
JNZ L1 ;repeat the loop if al != 28 (length of source string)
mov edx, OFFSET source
call WriteString ;Prints out source string (working fine)
mov edx, OFFSET target
call WriteString ;Prints out dest string (working fine)
writestringsインデックス付きアドレッシングを使用して実行しているときに、「ソース文字列をコピーしたい文字列をコピーしたい」というメッセージをコンソールに出力できるようになったため、一番下が適切に機能しています。
あなたは28、いないESIとアルを比較する必要があります:あなたが読んで、バイトではなく、ゼロの場合だけで確認してください。あなたのソース文字列は "#"で終わっていなければなりません。 – Tommylee2k
もちろん、あなたのソース文字列は "#" ;-)で終わらない – Tommylee2k
これは以前は見たことがないし、なぜ。これが何をしているのか、正確にどこに行くのかを説明できますか?私は文字列の引用内で、ちょうど外側と0の直後に試しましたが、それでもクラッシュし続けます。 Google/stackoverflow検索では、「#」で終わる文字列はあまり表示されません。 – zr0z