Условия в ассемблере - 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
Объяснение кода листинга программы
- Объявлены переменные: A, B, titl, buf, ifmt
- Начальная и конечная адреса массивов A и B записаны в ESI и EDI соответственно
- Ecx устанавливается равным 5, что указывает на количество чисел в массиве
- Цикл m1 начинается. В каждой итерации, он проверяет условие задачи и, если оно выполняется, записывает элемент массива A в массив B и переходит к следующему элементу массива A и B. Если условие не выполняется, он просто переходит к следующему элементу массива A и B.
- После завершения цикла m1, происходит вызов функции wsprintf для форматирования строки с использованием формата из переменной ifmt и значений из массива B.
- Вызов функции MessageBox для отображения сообщения с отформатированной строкой и заголовком из переменной titl.
- Вызов функции ExitProcess для завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д