Ввод двух целых чисел и проверка этих чисел условиями - Assembler

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

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

Задача в том, что нужно ввести два числа и проверить: если 1-е отрицательное и 2-е положительное то вывести '+', если нет то '-'. Без ввода чисел всё работало, а вот с вводом что только не пытался сделать, всё в никуда, т.к. в асм полный 0. Вот то что я попытался сделать по примерам:
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. string db 255,0,255 dup(?)
  5. ermsg db 'Error$'
  6. negflag dw ?
  7. .code
  8. s:
  9. mov ah,0ah
  10. lea dx,string
  11. int 21h
  12. xor ax,ax
  13. lea si,string+2
  14. mov negflag,ax
  15. cmp byte ptr [si],'-'
  16. jne z2
  17. not negflag
  18. inc si
  19. jmp z
  20. z2:
  21. cmp byte ptr [si],'+'
  22. jne z
  23. inc si
  24. z:
  25. cmp byte ptr [si],0Dh
  26. je ex1
  27. cmp byte ptr [si],'0'
  28. jb er
  29. cmp byte ptr [si],'9'
  30. ja er
  31. mov bx,10
  32. mul bx
  33. sub byte ptr [si],'0'
  34. add al,[si]
  35. adc ah,0
  36. inc si
  37. jmp z
  38. ex1:
  39. cmp negflag,0
  40. je viv
  41. neg ax
  42. viv:
  43. push ax
  44. mov ah,02 ;новая строка
  45. mov dl,0Ah
  46. int 21h
  47. pop ax
  48. xor cx,cx
  49. cmp ax,0 ;проверка первого числа на отрицательность
  50. jge no ;ax=>0? Да - прыгаем на no:
  51. mov bx,1
  52. cmp bx,0 ;проверка второго числа на позитивнось
  53. jle no ;bx<=0? Да - прыгаем на no:
  54. mov ah,02
  55. mov dl,'+' ;выводим + если все верно
  56. int 21h
  57. jmp endo
  58. no:
  59. mov ah,02
  60. mov dl,'-' ;выводим - когда не верно
  61. int 21h
  62. jmp endo
  63. er:
  64. mov ah,02
  65. mov dl,0Ah
  66. int 21h
  67. lea dx,ermsg
  68. mov ah,9
  69. int 21h
  70. jmp s
  71. endo:
  72. mov ah,4Ch
  73. int 21h
  74. end s
  75. end

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

textual
Листинг программы
  1. .model small
  2.  
  3. .stack 100h
  4.  
  5. .data
  6.  
  7.     string      db      255,0,255 dup(?)
  8.     ermsg       db      'Error$'
  9.     negflag     dw      ?
  10.  
  11. .code
  12.  
  13. main    proc
  14.         mov     ax,     @data
  15.         mov     ds,     ax
  16.  
  17.         ;ввод строки и преобразование её в число
  18. @@start:
  19.         ;ввод строки
  20.         mov     ah,     0ah
  21.         lea     dx,     string
  22.         int     21h
  23.  
  24.         xor     ax,     ax              ;ax - число, итог преобразований
  25.         lea     si,     string+2
  26.         mov     negflag,ax
  27.  
  28.         cmp     byte ptr [si],'-'
  29.         jne     z2
  30.         not     negflag
  31.         inc     si
  32.         jmp     @@NextChar
  33. z2:
  34.         cmp     byte ptr [si],'+'
  35.         jne     @@NextChar
  36.         inc     si
  37. @@NextChar:
  38.         ;если конец строки - завершить преобразование
  39.         cmp     byte ptr [si],0Dh
  40.         je      ex1
  41.         ;проверка символа на принадлежность цифрам
  42.         cmp     byte ptr [si],'0'
  43.         jb      er
  44.         cmp     byte ptr [si],'9'
  45.         ja      er
  46.  
  47.         mov     bx,     10
  48.         mul     bx
  49.         sub     byte ptr [si],'0'
  50.         add     al,     [si]
  51.         adc     ah,     0
  52.         inc     si
  53.         jmp     @@NextChar
  54. ex1:
  55.         cmp     negflag,0
  56.         je      viv
  57.         neg     ax
  58.  
  59.         ;обработка результатов ввода
  60. viv:
  61.         push    ax
  62.         mov     ah,     02      ;новая строка
  63.         mov     dl,     0Ah
  64.         int     21h
  65.         pop     ax
  66.         xor     cx,     cx
  67.  
  68.         cmp     ax,     0       ;проверка первого числа на отрицательность
  69.         jge     no              ;ax=>0? Да - прыгаем на no:
  70.  
  71.         mov     bx,     1
  72.         cmp     bx,     0       ;проверка второго числа на позитивнось
  73.         jle     no              ;bx<=0? Да - прыгаем на no:
  74.  
  75.         mov     ah,     02
  76.         mov     dl,     '+'     ;выводим + если все верно
  77.         int     21h
  78.         jmp     endo
  79. no:
  80.         mov     ah,     02
  81.         mov     dl,     '-'     ;выводим - когда не верно
  82.         int     21h
  83.         jmp     endo
  84. er:
  85.         mov     ah,     02
  86.         mov     dl,     0Ah
  87.         int     21h
  88.         lea     dx,     ermsg
  89.         mov     ah,     9
  90.         int     21h
  91.         jmp     @@start
  92. endo:
  93.         mov     ax,     4C00h
  94.         int     21h
  95. main    endp
  96.  
  97. end     main

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

Код на ассемблере выполняет ввод двух целых чисел и проверяет их условиями. Список действий:

  1. Ввод строки и преобразование её в число.
  2. Проверка символа на принадлежность цифрам.
  3. Обработка результатов ввода.
  4. Проверка первого числа на отрицательность.
  5. Проверка второго числа на позитивнось.
  6. Вывод символа + или - в зависимости от результатов проверки.
  7. Вывод сообщения об ошибке в случае некорректного ввода.
  8. Завершение работы программы.

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


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

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

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

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

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

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