通过char X86 MASM比较两个缓冲区

时间:2012-04-07 19:51:56

标签: assembly x86 masm masm32

我正在使用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

我无法弄清楚如何访问每个角色。

1 个答案:

答案 0 :(得分:2)

我相信这样的事情会帮助你。请记住,这是NASM而不是MASM,但这两个在基本语法方面应该基本相同。我不知道你的意思是" transpose",所以我只是将原始数组中的值复制到" 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