我正在使用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
我无法弄清楚如何访问每个角色。
答案 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