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