Ошибка вывода - Assembler
Формулировка задачи:
Доброго времени суток, требуется квалифицированная помощь.
Имеется массив. если хотя бы 1 пара одинаковых соседних элементов в нем есть, тогда вывести эту пару и следующие за ней значения.
До блока 4 - вывода на экран - всё хорошо.
далее, программа почему-то не реагирует на проверку регистра edx и зацикливается.
Заранее благодарю.
include "D:\fasmw\INCLUDE\win32ax.inc" .data ar dd 1, 2, 2, 4, 5, 6, 7, 8, 9, 4, 5, 7, 8, 9, 5, 4 arLength dd 13 caption db "Результат = %d", 0 tr db 50 DUP(?) .code main: mov ecx, [arLength] sub ecx, 1 mov ebx, -4 l1: ; БЛОК 1 // Нахождение пары соседних чисел add ebx, 4 mov eax, [ar+ebx] mov edx, [ar+ebx+4] cmp eax, edx je out1 jmp not2 not2: sub ecx, 1 ; БЛОК 2 // Проверка конца массива cmp ecx, 0 je exit jmp l1 out1: mov edx, ecx ; БЛОК 3 // Блок вывода значений на экран output: mov eax, [ar+ebx] invoke wsprintfA, addr tr, addr caption, eax invoke MessageBoxA, 0, addr tr, addr caption, 0 add ebx, 4 sub edx, 1 cmp edx, 0 jg output ; БЛОК 4 // jmp exit exit: invoke ExitProcess, 0 .end main
Решение задачи: «Ошибка вывода»
textual
Листинг программы
;FASM, сохранять в cp866 format PE console 4.0 include 'win32a.inc' mov ecx, [arLength] sub ecx, 1 mov ebx, -4 l1: ; БЛОК 1 // Нахождение пары соседних чисел add ebx, 4 mov eax, [ar+ebx] mov edx, [ar+ebx+4] cmp eax, edx je out1 jmp not2 not2: sub ecx, 1 ; БЛОК 2 // Проверка конца массива cmp ecx, 0 je gtfo jmp l1 out1: mov edx, ecx ; БЛОК 3 // Блок вывода значений на экран output: mov eax, [ar+ebx] pusha cinvoke printf, caption, eax popa add ebx, 4 sub edx, 1 cmp edx, 0 jg output ; БЛОК 4 // jmp gtfo gtfo: invoke exit, 0 ar dd 1, 2, 2, 4, 5, 6, 7, 8, 9, 4, 5, 7, 8, 9, 5, 4 arLength dd 13 caption db "Результат = %d", 10, 13, 0 ;tr db 50 DUP(?) data import library msvcrt,'msvcrt.dll' import msvcrt,\ printf,'printf',\ exit,'exit' end data
Объяснение кода листинга программы
- Переменная
ecx
инициализируется значением переменнойarLength
. - Значение
ecx
уменьшается на единицу. - Переменная
ebx
инициализируется отрицательным значением 4. - Организуется цикл, в котором выполняются следующие действия:
- К переменной
ebx
прибавляется 4. - В переменные
eax
иedx
записываются значения по адресамar+ebx
иar+ebx+4
соответственно. - Проверяется, равны ли значения в
eax
иedx
. Если да, то выполняется переход к блоку вывода. - Если значение
ecx
меньше 1, то выполняется переход к блоку вывода. - Уменьшается значение
ecx
на единицу. - Проверяется, равно ли значение
ecx
нулю. Если да, то выполняется переход к блоку вывода. - Если значение
ecx
больше нуля, то выполняется переход к блоку вывода.
- К переменной
- Переменная
edx
инициализируется значением переменнойecx
. - Переменная
ebx
уменьшается на 4. - Переменная
eax
инициализируется значениемar+ebx
. - Выполняется вызов функции
printf
, передавая в качестве аргументов строкуРезультат = %d
, значение переменнойeax
и символ новой строки. - Выполняется выход из функции
printf
. - Переменная
ebx
увеличивается на 4. - Переменная
edx
уменьшается на единицу. - Проверяется, равно ли значение
edx
нулю. Если нет, то выполняется переход к шагу 8. - Выполняется вызов функции
exit
, передавая в качестве аргумента число 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д