2012-04-07 5 views
1

文字X86 MASMことにより、2つのバッファを比較し、それらが第3のバッファに一致するかどう文字で二つのバッファを比較し、反映する必要が私はX86アセンブリを使用しています

擬似コード:私は

Compare(ESI=msg_buffer_ptr, EDI=recover_buffer_ptr, EBX=err_buffer_ptr) 

;Compare a character in ESI && EDI 
;if ESI == 0 then we are at the end of the string and just return after adding add a 0 to EBX 
;if they equal; " " -> EBX 
;if it's a 0dh or 0ah, then transpose them into EBX 
;else if they don't equal; "X" -> EBX 
;Loop to next character 

それぞれのキャラクターがどのようにアクセスするかを理解するのが難しい。

答えて

2

私はこれがあなたを助けるはずだと信じています。これはMASMではなくNASMであることに留意してください。しかし、これらの2つは基本構文の点ではほとんど同じです。私はあなたが "転置"の意味を知らないので、元の配列の値を "err"配列にコピーするだけです。

基本的に、各文字のループは、インデックスレジスタ(この場合はecx)を持ち、バイト命令で配列にアクセスすることによって行われます。この場合、命令のサイズはオペランドによって暗黙的に与えられます。たとえば、mov al, [esi+ecx]またはcmp al, [edi+ecx]です。バイトレジスタだけを使用します。

とにかく、コードは関数として書かれています。私は、呼び出し先がレジスタを節約する必要がないと仮定しました。

compare: 
    xor ecx, ecx 

.loop: 
    mov al, [esi+ecx] 
    test al, al 
    jz .end 

    cmp al, [edi+ecx] 
    je .equal 

    cmp al, 0xa 
    je .endloop 

    cmp al, 0xd 
    je .endloop 

    mov al, 'X' 
    jmp .endloop 

.equal: 
    mov al, ' ' 

.endloop: 
    mov [ebx+ecx], al 
    add ecx, 1 
    jmp .loop 

.end: 
    mov [ebx+ecx], byte 0 
    ret 
+0

これは意味があります。私は間違いなく私の頭の中で物事を複雑にしていた。ありがとう!! – alicht

関連する問題