2012-04-07 1 views
1

Я использую X86 Ассамблею и нужно сравнить два буфера по характеру и отражают, если они совпадают или не в третьем буфереСравнение двух буферов по полукоксу 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 

Я не понимая, как получить доступ к каждому персонажу.

ответ

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

Это имеет смысл. Я определенно переусердствовал в моей голове. Благодаря!! – alicht