2016-11-23 16 views
1

私はまだ組み立てが新しく、今夜だけでも多くのことを間違っているかもしれないが、大部分を理解し始めていますが、私は経験不足のためにどこにいるのかを教えてくれました。間接アドレッシングを使用して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インデックス付きアドレッシングを使用して実行しているときに、「ソース文字列をコピーしたい文字列をコピーしたい」というメッセージをコンソールに出力できるようになったため、一番下が適切に機能しています。

+0

あなたは28、いないESIとアルを比較する必要があります:あなたが読んで、バイトではなく、ゼロの場合だけで確認してください。あなたのソース文字列は "#"で終わっていなければなりません。 – Tommylee2k

+1

もちろん、あなたのソース文字列は "#" ;-)で終わらない – Tommylee2k

+0

これは以前は見たことがないし、なぜ。これが何をしているのか、正確にどこに行くのかを説明できますか?私は文字列の引用内で、ちょうど外側と0の直後に試しましたが、それでもクラッシュし続けます。 Google/stackoverflow検索では、「#」で終わる文字列はあまり表示されません。 – zr0z

答えて

1

文字列はNULで終了します(文字列の末尾には,0)。したがって、文字列を変更した場合に変更する必要のあるハードコードされた長さとの比較については忘れてください。

L1: 
    mov al,[esi]  
    mov [edi],al  
    inc esi    
    inc edi    
    test al,al   ; you could also use cmp al,0 if you prefer that 
    JNZ L1    ; repeat the loop if al != 0 
+0

はい!これはとてもシンプルで、トンを助けました!これは初めてのcmp/testを使用したもので、私は一般的な考えを持っていましたが、100%正しく実行しませんでした。説明に感謝します。アセンブリでループを使用した以前の経験は、インデックス付きアドレッシングを使用するループカウンタを使用したので、これは良い学習体験でした。 – zr0z