Ввод с клавиатуры и вывод на экран - Assembler

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

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

Изучаю совсем недавно ASM, изучение идёт ну очееень тяжело. Помогите пожалуйста всё "по полочкам" разложить. Перечитала многое, всё равно не могу понять что да как. Программу помогли исправить ( за что огромное спасибо), но как её же переписать под ввод-вывод не понимаю. Уравнение, которые описано в программе: F= (12563 / 78)+ X -(Y *2852)
Листинг программы
  1. masm
  2. Model small
  3. .386
  4. .stack 400h
  5. .data
  6. x dd 3h
  7. y dd 4h
  8. f dd ?
  9. .code
  10. start:
  11. mov ax,@data
  12. mov ds,ax
  13. mov eax,Y
  14. mov ebx,2852
  15. imul ebx;edx:eax=Y *2852
  16. mov esi,eax
  17. mov edi,edx
  18. mov eax,12563
  19. cdq; edx=0 or edx=-1
  20. mov ebx,78
  21. idiv ebx; eax=12563/78
  22. cdq
  23. add eax,X
  24. adc edx,0;edx:eax= (12563 / 78)+ X
  25. sub eax,esi
  26. sbb edx,edi;edx:eax= (12563 / 78)+ X -(Y *2852)
  27. mov f, eax
  28. mov ax,4c00h
  29. int 21h
  30. end start

Решение задачи: «Ввод с клавиатуры и вывод на экран»

textual
Листинг программы
  1. ;F= (12563 / 78)+ X -(Y *2852)
  2. LOCALS
  3.  
  4. .model small
  5.  
  6. .stack 100h
  7.  
  8. .data
  9.         CrLf            db      0Dh, 0Ah, '$'
  10.         PromptGetX      db      'Input X (-32768..+32767): ', '$'
  11.         PromptGetY      db      'Input Y (-32768..+32767): ', '$'
  12.         KeyBuf          db      7, 0, 8 dup(0)      ;max,len,string,CR(0dh)
  13.         msgError        db      'Ошибка ввода числа', 0Dh, 0Ah, '$'
  14.  
  15.         X               dw      ?
  16.         Y               dw      ?
  17.         F               dw      ?
  18. .code
  19.  
  20. main    proc
  21.         mov     ax,     @data
  22.         mov     ds,     ax
  23.  
  24. @@GetX:
  25.         ; ввод числа с клавиатуры (строки)
  26.         lea     dx, PromptGetX
  27.         mov     ah,09h
  28.         int     21h
  29.  
  30.         mov     ah, 0Ah
  31.         mov     dx, offset KeyBuf
  32.         int     21h
  33.  
  34.         ; перевод строки (на новую строку)
  35.         lea     dx, CrLf
  36.         mov     ah,09h
  37.         int     21h
  38.  
  39.         ; преобразование строки в число
  40.         lea     si, KeyBuf+1
  41.         lea     di, X
  42.         call    Str2Num
  43.  
  44.         ; проверка на ошибку
  45.         jnc     @@GetY
  46.  
  47.         ; если есть ошибка ввода - напечатать сообщение об ошибке
  48.         lea     dx, msgError
  49.         mov     ah,09h
  50.         int     21h
  51.         jmp     @@GetX
  52.  
  53. @@GetY:
  54.         ; ввод числа с клавиатуры (строки)
  55.         lea     dx, PromptGetY
  56.         mov     ah,09h
  57.         int     21h
  58.  
  59.         mov     ah, 0Ah
  60.         mov     dx, offset KeyBuf
  61.         int     21h
  62.  
  63.         ; перевод строки (на новую строку)
  64.         lea     dx, CrLf
  65.         mov     ah,09h
  66.         int     21h
  67.  
  68.         ; преобразование строки в число
  69.         lea     si, KeyBuf+1
  70.         lea     di, Y
  71.         call    Str2Num
  72.  
  73.         ; проверка на ошибку
  74.         jnc     @@Calc
  75.  
  76.         ; если есть ошибка ввода - напечатать сообщение об ошибке
  77.         lea     dx, msgError
  78.         mov     ah,09h
  79.         int     21h
  80.         jmp     @@GetY
  81.  
  82. @@Calc:
  83.         ;F= (12563 / 78)+ X -(Y *2852)
  84.         mov     ax,     12563
  85.         cwd
  86.         mov     bx,     78
  87.         idiv    bx              ;ax:= (12563 / 78)
  88.         add     ax,     X       ;ax:= (12563 / 78) + X
  89.         mov     bx,     ax      ;bx:= (12563 / 78) + X
  90.  
  91.         mov     ax,     2852
  92.         imul    Y               ;ax:= Y*2852
  93.  
  94.         sub     bx,     ax      ;bx:=(12563 / 78)+ X -(Y *2852)
  95.         mov     F,      bx
  96.  
  97.         mov     ax,     F
  98.         call    Show_AX
  99.  
  100.         mov     ax,     4C00h
  101.         int     21h
  102. main    endp
  103.  
  104. ; выводит число из регистра AX на экран
  105. ; входные данные:
  106. ; ax - число для отображения
  107. Show_AX proc
  108.         push    ax
  109.         push    bx
  110.         push    cx
  111.         push    dx
  112.         push    di
  113.  
  114.         mov     cx, 10
  115.         xor     di, di          ; di - кол. цифр в числе
  116.  
  117.         ; если число в ax отрицательное, то
  118.         ;1) напечатать '-'
  119.         ;2) сделать ax положительным
  120.         or      ax, ax
  121.         jns     @@Conv
  122.         push    ax
  123.         mov     dx, '-'
  124.         mov     ah, 2           ; ah - функция вывода символа на экран
  125.         int     21h
  126.         pop     ax
  127.  
  128.         neg     ax
  129.  
  130. @@Conv:
  131.         xor     dx, dx
  132.         div     cx              ; dl = num mod 10
  133.         add     dl, '0'         ; перевод в символьный формат
  134.         inc     di
  135.         push    dx              ; складываем в стэк
  136.         or      ax, ax
  137.         jnz     @@Conv
  138.         ; выводим из стэка на экран
  139. @@Show:
  140.         pop     dx              ; dl = очередной символ
  141.         mov     ah, 2           ; ah - функция вывода символа на экран
  142.         int     21h
  143.         dec     di              ; повторяем пока di<>0
  144.         jnz     @@Show
  145.  
  146.         pop     di
  147.         pop     dx
  148.         pop     cx
  149.         pop     bx
  150.         pop     ax
  151.         ret
  152. Show_AX endp
  153.  
  154. ; преобразования строки в число
  155. ; на входе:
  156. ; ds:[si] - строка с числом
  157. ; ds:[di] - адрес числа
  158. ; на выходе
  159. ; ds:[di] - число
  160. ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
  161. Str2Num proc
  162.         push    ax
  163.         push    bx
  164.         push    cx
  165.         push    dx
  166.         push    ds
  167.         push    es
  168.         push    si
  169.  
  170.         push    ds
  171.         pop     es
  172.  
  173.         mov     cl, ds:[si]
  174.         xor     ch, ch
  175.  
  176.         inc     si
  177.  
  178.         mov     bx, 10
  179.         xor     ax, ax
  180.  
  181.         ;если в строке первый символ '-'
  182.         ; - перейти к следующему
  183.         ; - уменьшить количество рассматриваемых символов
  184.         cmp     byte ptr [si], '-'
  185.         jne     @@Loop
  186.         inc     si
  187.         dec     cx
  188. @@Loop:
  189.         mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
  190.         mov     [di], ax   ; игнорируем старшее слово
  191.         cmp     dx, 0      ; проверяем, результат на переполнение
  192.         jnz     @@Error
  193.  
  194.         mov     al, [si]   ; Преобразуем следующий символ в число
  195.         cmp     al, '0'
  196.         jb      @@Error
  197.         cmp     al, '9'
  198.         ja      @@Error
  199.         sub     al, '0'
  200.         xor     ah, ah
  201.         add     ax, [di]
  202.         jc      @@Error    ; Если сумма больше 65535
  203.         cmp     ax, 8000h
  204.         ja      @@Error
  205.         inc     si
  206.  
  207.         loop    @@Loop
  208.  
  209.         pop     si         ;проверка на знак
  210.         push    si
  211.         inc     si
  212.         cmp     byte ptr [si], '-'
  213.         jne     @@Check    ;если должно быть положительным
  214.         neg     ax         ;если должно быть отрицательным
  215.         jmp     @@StoreRes
  216. @@Check:                   ;дополнительная проверка, когда при вводе положительного числа получили отрицательное
  217.        or       ax, ax     ;
  218.        js       @@Error
  219. @@StoreRes:                ;сохранить результат
  220.         mov     [di], ax
  221.         clc
  222.         pop     si
  223.         pop     es
  224.         pop     ds
  225.         pop     dx
  226.         pop     cx
  227.         pop     bx
  228.         pop     ax
  229.         ret
  230. @@Error:
  231.         xor     ax, ax
  232.         mov     [di], ax
  233.         stc
  234.         pop     si
  235.         pop     es
  236.         pop     ds
  237.         pop     dx
  238.         pop     cx
  239.         pop     bx
  240.         pop     ax
  241.         ret
  242. Str2Num endp
  243.  
  244. end     main

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

  1. Создаются переменные с помощью директивы .data:
    • CrLf - символ новой строки
    • PromptGetX - строка с текстом Input X (-32768..+32767):
    • PromptGetY - строка с текстом Input Y (-32768..+32767):
    • KeyBuf - массив для ввода текста с клавиатуры
    • msgError - строка с сообщением об ошибке
    • X - переменная для хранения значения X
    • Y - переменная для хранения значения Y
    • F - переменная для результата расчета
  2. В процедуре main выполняется обработка ввода пользователя:
    • Вводится значение X
    • Преобразуется значение X в число
    • Проверяется наличие ошибок ввода
    • Вводится значение Y
    • Преобразуется значение Y в число
    • Проверяется наличие ошибок ввода
  3. Рассчитывается значение F:
    • Выполняются математические операции с числами (12563, 78, X, Y, 2852)
    • Результат сохраняется в переменной F.
  4. Вызывается процедура Show_AX для вывода значения переменной F на экран.
  5. Программа завершается.

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


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

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

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы