2012-04-07 36 views
1

我使用X86大會和需要逐個字符兩個緩衝區比較和反映,如果他們在第三緩衝匹配或不成炭X86 MASM比較兩個緩衝區

僞代碼:

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 

我無法確定如何訪問每個角色。

回答

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 
+0

這是有道理的。我腦海中的事情絕對過於複雜。謝謝!! – alicht 2012-04-10 21:43:44