【问题标题】:Compare two buffers by char X86 MASM通过 char X86 MASM 比较两个缓冲区
【发布时间】:2012-04-07 19:51:56
【问题描述】:

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

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

【问题讨论】:

    标签: assembly x86 masm masm32


    【解决方案1】:

    我相信这样的事情应该可以帮助你。请记住,这是 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
    

    【讨论】:

    • 这是有道理的。我肯定把事情复杂化了。谢谢!!
    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多