Реализовать цикл от 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

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

Список действий в коде:

  1. Инициализация счётчика SI = 0.
  2. Установка счётчика CX = 1.
  3. Начало цикла:
    • Вычисление значения AX = CX.
    • Начальное значение регистра DX равно 0.
    • Деление AX на BX (содержимое регистра BX равно 21).
    • Уменьшение значения AX на 1.
    • Побитовое сдвигание значения AX вправо на 1 позицию.
    • Если результат отрицательный (CF = 1), то переход к блоку кода после цикла.
    • Инкремент счётчика SI.
    • Сравнение значения SI с 200.
    • Если результат отрицательный (CF = 0), то продолжение цикла.
    • Сохранение значения регистра CX в стеке.
  4. Блок кода после цикла:
    • Вызов подпрограммы OutAx.
    • Инкремент счётчика SI.
    • Если значение SI меньше 200, то продолжение цикла.
    • Если значение SI равно 200, то значение регистра AX устанавливается равным -1.
    • Инкремент счётчика CX.
    • Если значение CX меньше 8, то продолжение цикла.
    • Если значение CX равно 8, то значение регистра AX устанавливается равным 0.
    • Вызов прерывания 29h (для вывода символа).
    • Организация цикла, пока значение регистра CX больше или равно 8.
    • Вывод значения регистра AX.
    • Окончание работы подпрограммы OutAx.
    • Восстановление значений регистров BX и CX.
    • Возврат в основную программу.
  5. Подпрограмма OutAx:
    • Сохранение значения регистра CX в стеке.
    • Сохранение значения регистра BX в стеке.
    • Установка значения регистра BX равным 10.
    • Установка значения регистра CX равным 0.
    • Организация цикла, пока значение регистра CX больше или равно 8.
    • Вывод значения регистра AX.
    • Вызов прерывания 29h (для вывода символа).
    • Инкремент значения регистра CX.
    • Если значение регистра CX меньше 8, то продолжение цикла.
    • Если значение регистра CX равно 8, то значение регистра AX устанавливается равным 0.
    • Вызов прерывания 29h (для вывода символа).
    • Восстановление значений регистров BX и CX.
    • Возврат в основную программу.

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


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

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

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