1

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

我无法弄清楚如何按每个字符访问 。

4

1 回答 1

2

我相信这样的事情应该可以帮助你。请记住,这是 NASM 而不是 MASM,但这两者在基本语法方面应该几乎相同。我不知道您所说的“转置”是什么意思,所以我只是将原始数组中的值复制到“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
于 2012-04-08T00:26:13.343 回答