2012-04-07 3 views
1

I X86 Assembly bin mit und müssen zwei Puffer von Zeichen vergleichen und reflektieren, wenn sie in einem dritten Puffer übereinstimmen oder nichtVergleichen Sie zwei Puffer von char X86 MASM

psuedocode:

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 

Ich bin Probleme haben, herauszufinden, wie man von jedem Zeichen auf das zugreift.

Antwort

2

Ich glaube, dass so etwas Ihnen helfen sollte. Denken Sie daran, dass dies eher NASM als MASM ist, aber diese beiden sollten in Bezug auf die grundlegende Syntax ziemlich identisch sein. Ich weiß nicht, was Sie mit "transpose" meinen, also kopiere ich einfach den Wert vom ursprünglichen Array in das Array "err".

Grundsätzlich wird das Schleifen jedes Zeichens durch ein Indexregister (in diesem Fall ecx) und den Zugriff auf das Array über Byteanweisungen ausgeführt. In diesem Fall wird die Größe des Befehls implizit durch die Operanden angegeben, zum Beispiel mov al, [esi+ecx] oder cmp al, [edi+ecx] - wir verwenden nur ein Byte-Register.

Wie auch immer, der Code wird als eine Funktion geschrieben. Ich nahm an, dass keine Register vom Angerufenen gespeichert werden müssen.

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

Das macht Sinn. Ich habe die Dinge in meinem Kopf definitiv überkompensiert. Vielen Dank!! – alicht