Сравнение двух массивов - Assembler (250006)

Узнай цену своей работы

Формулировка задачи:

написал на yasm функцию сравнения 2-х массивов одной длины (пока что одной), но она всегда возвращает, то что они равны. Вход SI - адрес первого массива DI - адрес второго массива AX - длина первого массива BX - длина второго массива выход: BL - 0 не равны 1 равны
    
cmparr:     ;==============================================================================
        
        mov CX, 0
        dec AX
        ___CMPARR_MAIN__LOOP___:
            xor BX, BX
            mov BX, [DI]
            cmp [SI], BX
            jne ___CMPARR_NEQ___
            inc CX
            cmp CX, AX
            je ___CMPARR_EQ___
            inc SI
            inc DI
            jmp ___CMPARR_MAIN__LOOP___

        ___CMPARR_NEQ___:
            xor BX, BX
            mov BL, 0
            ret
        ___CMPARR_EQ___:
            xor BX, BX
            mov BL, 1
            ret
        ;==============================================================================
Можете пожалуйста подсказать что не так?

Решение задачи: «Сравнение двух массивов»

textual
Листинг программы
;сравнение двух строк
;на входе:
; ds:si - адрес первой строки
; cx    - длина первой строки
; ds:di - адрес второй строки
; bx    - длина второй строки
;на выходе:
;  CY=1 ZF=0, при S1<S2
;  CY=0 ZF=1, при S1=S2
;  CY=0 ZF=0, при S1>S2
SCmp    proc
    push    ax
    push    bx
    push    cx
    push    dx
    push    si
    push    di
    push    es
 
    push    ds
    pop es
 
    ;ax=cx=len1
    ;cx=min(len1, len2)
    ;bx=len2-min(len1, len2)=0 или разность длин
    push    cx
    push    bx
    sub     bx, cx
    sbb     ax, ax
    and     ax, bx
    add     cx, ax
    pop bx
    pop ax
    sub bx, ax
    ;сравнить подстроки минимальной длины
    repe    cmpsb
    jnz @@scExit
@@scCmpLen:
    ;если подстроки равны, то проверить длины
    xor ax, ax
    cmp ax, bx
@@scExit:
    pop es
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
SCmp    endp

Объяснение кода листинга программы

Код выполняет сравнение двух строк.

  1. Сначала в процедуры SCmp закладываются все входы и выходы: ds:si — адрес первой строки cx — длина первой строки ds:di — адрес второй строки bx — длина второй строки
  2. Далее происходит подготовительная работа: — ax=cx=len1 (длина первой строки) — cx=min(len1, len2) (минимальная длина из двух строк) — bx=len2-min(len1, len2)=0 или разность длин
  3. Затем происходит сравнение подстрок минимальной длины: — repe cmpsb (цикл, пока не найдётся различающаяся подстрока) — jnz @@scExit (если различия не найдены, перейти к проверке длин)
  4. Если подстроки равны, то проверяются длины: — xor ax, ax (ax=0) — cmp ax, bx (если ax=0, то строки равны)
  5. В конце процедуры все регистры восстанавливаются и возвращается управление на вызовшую программу. В результате выполнения процедуры SCmp возвращается код операции: CY=1 ZF=0, при S1<S2 CY=0 ZF=1, при S1=S2 CY=0 ZF=0, при S1>S2

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы