1

X86 アセンブリを使用しており、2 つのバッファーを文字ごとに比較し、それらが一致するかどうかを 3 番目のバッファーに反映する必要があります。

疑似コード:

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

各文字の へのアクセス方法がわかりません。

4

1 に答える 1

2

このような何かがあなたを助けるはずだと私は信じています。これは MASM ではなく NASM であることに注意してください。ただし、これら 2 つは基本的な構文に関してはほぼ同じである必要があります。「転置」の意味がわからないので、元の配列から「err」配列に値をコピーするだけです。

基本的には、インデックスレジスタ(この場合はecx)を持ち、バイト命令で配列にアクセスすることで、1文字ずつループします。この場合、命令のサイズはオペランドによって暗黙的に指定されます。たとえば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
于 2012-04-08T00:26:13.343 に答える