Ошибка вывода - 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

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

  1. Переменная ecx инициализируется значением переменной arLength.
  2. Значение ecx уменьшается на единицу.
  3. Переменная ebx инициализируется отрицательным значением 4.
  4. Организуется цикл, в котором выполняются следующие действия:
    • К переменной ebx прибавляется 4.
    • В переменные eax и edx записываются значения по адресам ar+ebx и ar+ebx+4 соответственно.
    • Проверяется, равны ли значения в eax и edx. Если да, то выполняется переход к блоку вывода.
    • Если значение ecx меньше 1, то выполняется переход к блоку вывода.
    • Уменьшается значение ecx на единицу.
    • Проверяется, равно ли значение ecx нулю. Если да, то выполняется переход к блоку вывода.
    • Если значение ecx больше нуля, то выполняется переход к блоку вывода.
  5. Переменная edx инициализируется значением переменной ecx.
  6. Переменная ebx уменьшается на 4.
  7. Переменная eax инициализируется значением ar+ebx.
  8. Выполняется вызов функции printf, передавая в качестве аргументов строку Результат = %d, значение переменной eax и символ новой строки.
  9. Выполняется выход из функции printf.
  10. Переменная ebx увеличивается на 4.
  11. Переменная edx уменьшается на единицу.
  12. Проверяется, равно ли значение edx нулю. Если нет, то выполняется переход к шагу 8.
  13. Выполняется вызов функции exit, передавая в качестве аргумента число 0.

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


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

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

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