Условия в ассемблере - Assembler

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

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

Есть такая задача: Дано массив данных А с 5-ти элементов . Создать массив В , в который входят элементы массива А, что удовлетворяют условие -1<= B >128 . Прекратить выполнение программы, если будет найдено 5 элементов со значение 12. Вывести сообщения . Вот я пытался для начала просто создать и вывести массив В:
.686           
.model flat,stdcall                     
option casemap:none  
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc       
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
A dd -1,22,333,-45,500
B dd 5 dup (0)
titl db "Программа",0    ;название окна
buf db 0,0               ;буфер для вывода
ifmt db "Массив В={%d,%d,%d,%d,%d}",0dh,0ah,0
.code
_Start:
lea esi,A           ;адресс начала массива А
lea edi,B           ;адресс начала массива В
mov ecx,5           ;количество чисел массива 
 
m1: mov eax,[esi]   ;помещаем в eax число с массива А
.IF(eax>=-1)&&(eax>128)     ;если выполняется условие задачи
mov [edi],eax               ;записать элемент массива А в массив В
add esi,4                   ;переход на следующий элемент 
.ELSE                       ;если условие не выполняется
add esi,4                   ;переход на следующий элемент
.ENDIF
loop m1                     ;пока ecx!=0
invoke wsprintf,ADDR buf,ADDR ifmt,B[0],B[4],B[8],B[12],B[16]
invoke MessageBox, 0, ADDR buf,ADDR titl, MB_OK
invoke ExitProcess,0
end _Start
Но в итоге выводит просто пять нулей. Вроде всё правильно написал , не могу понять , что не так. Помогите , пожалуйста , найти ошибку. Заранее огромное спасибо!

Решение задачи: «Условия в ассемблере»

textual
Листинг программы
.data
A dd -1,22,333,-45,500
B dd 5 dup (0)
titl db "Программа",0    ;название окна
buf db 0,0               ;буфер для вывода
ifmt db "Массив В={%d,%d,%d,%d,%d}",0dh,0ah,0
.code
_Start:
lea esi,A           ;адресс начала массива А
lea edi,B           ;адресс начала массива В
mov ecx,5           ;количество чисел массива 
 
m1: mov eax,[esi]   ;помещаем в eax число с массива А
.IF(eax>=-1)&&(eax>128)     ;если выполняется условие задачи
mov [edi],eax               ;записать элемент массива А в массив В
add esi,4                   ;переход на следующий элемент 
add edi,4
.ELSE                       ;если условие не выполняется
add esi,4                   ;переход на следующий элемент
add edi,4
.ENDIF
loop m1                     ;пока ecx!=0
invoke wsprintf,ADDR buf,ADDR ifmt,B[0],B[4],B[8],B[12],B[16]
invoke MessageBox, 0, ADDR buf,ADDR titl, MB_OK
invoke ExitProcess,0
end _Start

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

  1. Объявлены переменные: A, B, titl, buf, ifmt
  2. Начальная и конечная адреса массивов A и B записаны в ESI и EDI соответственно
  3. Ecx устанавливается равным 5, что указывает на количество чисел в массиве
  4. Цикл m1 начинается. В каждой итерации, он проверяет условие задачи и, если оно выполняется, записывает элемент массива A в массив B и переходит к следующему элементу массива A и B. Если условие не выполняется, он просто переходит к следующему элементу массива A и B.
  5. После завершения цикла m1, происходит вызов функции wsprintf для форматирования строки с использованием формата из переменной ifmt и значений из массива B.
  6. Вызов функции MessageBox для отображения сообщения с отформатированной строкой и заголовком из переменной titl.
  7. Вызов функции ExitProcess для завершения программы.

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


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

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

8   голосов , оценка 4 из 5