Реализовать цикл от 1 до 32678 (short int) - Assembler
Формулировка задачи:
На промежутке от 1 до 32768. Подсчитать количество таких чисел X, что ((Хdiv21))-1) - четное число. Ответ вывести на экран.
помогите , пожалуйста, реализовать цикл. Заодно найти двухсотый элемент.
у меня выдает ошибку на делении на 2(пишет целочисленное переполнение) я даже изменил х на unsigned __int32 (взамен short int)
#include <iostream> #include <conio.h> int main() { unsigned __int32 x = 1; unsigned __int32 k = 0; for (int x = 1; x != 32768; x++) { if (fmod(((x / 21) - 1),2) == 0) { k++; if (k == 200) std::cout << " cpp 200 napa " << x << std::endl; } } std::cout << "cpp (x / 21 - 1) mod 2 = " << k << std::endl; k = 0; x = 1; unsigned __int32 e = 0; __asm { mov Bl, 2; mov cx, 21; m1: inc x; //======body========= mov dx, word ptr x + 2; mov AX, word ptr x + 0; div cx; // ax dx остаток mov dx, 0; dec ax; div BL; mov al, 0; //mov e, ax; //==================== cmp ah, 0; //мод 2 jne m; inc k; cmp k, 200; jne m; //если к меньше то идем дальше если больше то прыгаем на м //============== //mov dx, word ptr x + 2; //mov AX, word ptr x + 0; //mov word ptr e + 2, dx; //mov word ptr e, ax; //============== m: cmp word ptr x, 32768; jle m1; } std::cout << "asm k = " << k << std::endl; if (e == 0) std::cout << "asm 200 napa не найдена " << std::endl; else std::cout << "asm 200 napa = " << e; _getch(); }
Решение задачи: «Реализовать цикл от 1 до 32678 (short int)»
textual
Листинг программы
model tiny .code org 100h begin: xor si,si mov bx,21 mov cx,1 @@01: mov ax,cx xor dx,dx div bx dec ax shr ax,1 jc @@02 mov ax,cx call OutAx inc si cmp si,200 jnz @@02 push cx @@02: inc cx jns @@01 pop ax call OutAx xor ax,ax int 16h ret OutAx: push cx push bx mov bx,10 xor cx,cx @@03: xor dx,dx div bx push dx inc cx or ax,ax jnz @@03 mov ax,-1h @@04: inc cx push ax cmp cx,8 jnz @@04 @@05: pop ax or al,'0' int 29h loop @@05 pop bx pop cx ret end begin
Объяснение кода листинга программы
Список действий в коде:
- Инициализация счётчика SI = 0.
- Установка счётчика CX = 1.
- Начало цикла:
- Вычисление значения AX = CX.
- Начальное значение регистра DX равно 0.
- Деление AX на BX (содержимое регистра BX равно 21).
- Уменьшение значения AX на 1.
- Побитовое сдвигание значения AX вправо на 1 позицию.
- Если результат отрицательный (CF = 1), то переход к блоку кода после цикла.
- Инкремент счётчика SI.
- Сравнение значения SI с 200.
- Если результат отрицательный (CF = 0), то продолжение цикла.
- Сохранение значения регистра CX в стеке.
- Блок кода после цикла:
- Вызов подпрограммы OutAx.
- Инкремент счётчика SI.
- Если значение SI меньше 200, то продолжение цикла.
- Если значение SI равно 200, то значение регистра AX устанавливается равным -1.
- Инкремент счётчика CX.
- Если значение CX меньше 8, то продолжение цикла.
- Если значение CX равно 8, то значение регистра AX устанавливается равным 0.
- Вызов прерывания 29h (для вывода символа).
- Организация цикла, пока значение регистра CX больше или равно 8.
- Вывод значения регистра AX.
- Окончание работы подпрограммы OutAx.
- Восстановление значений регистров BX и CX.
- Возврат в основную программу.
- Подпрограмма OutAx:
- Сохранение значения регистра CX в стеке.
- Сохранение значения регистра BX в стеке.
- Установка значения регистра BX равным 10.
- Установка значения регистра CX равным 0.
- Организация цикла, пока значение регистра CX больше или равно 8.
- Вывод значения регистра AX.
- Вызов прерывания 29h (для вывода символа).
- Инкремент значения регистра CX.
- Если значение регистра CX меньше 8, то продолжение цикла.
- Если значение регистра CX равно 8, то значение регистра AX устанавливается равным 0.
- Вызов прерывания 29h (для вывода символа).
- Восстановление значений регистров BX и CX.
- Возврат в основную программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д