Вывод числа - Assembler

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

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

Доброго вечера. Допустим, есть готовая программа, находящая max элемент массива. Как его вывести?
Листинг программы
  1. StackSG segment
  2. dw 1024 dup (?)
  3. StackSG Ends
  4. DataSG Segment;
  5. array db 7,2,10,4,26
  6. k db 'Max element massiva: $'
  7. DataSG Ends
  8. CodeSG Segment
  9. assume ss:StackSG,cs:CodeSG,ds:DataSG
  10. start:
  11. mov ax, DataSG
  12. mov ds, ax
  13. mov si, offset array
  14. mov cx, 5
  15. xor bx, bx
  16. mov bl, al
  17. mov ah,09
  18. mov dx,offset k
  19. int 21h
  20. gg:
  21. lodsb
  22. cmp al, bh
  23. jg max
  24. cmp al, bl
  25. jl min
  26. jmp away
  27. min:
  28. mov bl, al
  29. jmp away
  30. max:
  31. mov bh, al
  32. away:
  33. loop gg
  34. mov ah,4ch
  35. int 21h
  36. CodeSG Ends
  37. END start
Прочекал эту тему: http://www.cyberforum.ru/assembler/thread54461.html Перепробовал все, не получилось. Обычно всегда использовал
Листинг программы
  1. ...
  2. mov ah,09
  3. mov dx,ax
  4. int 21h
  5. ...
Хелп, пожалуйста...

Решение задачи: «Вывод числа»

textual
Листинг программы
  1. StackSG segment
  2.     dw  1024    dup (?)
  3. StackSG Ends
  4. DataSG  Segment;
  5.     array db 70,2,10,4,26
  6.     k db 'Max element massiva: $'
  7. DataSG Ends
  8. CodeSG  Segment
  9.     assume  ss:StackSG,cs:CodeSG,ds:DataSG
  10.  
  11.     start:
  12. mov ax, DataSG
  13. mov ds, ax
  14.  
  15. mov ah,09
  16. mov dx,offset k
  17. int 21h
  18.  
  19.      mov si, offset array
  20.      xor bx, bx
  21.      mov cx, 5
  22. gg:
  23.      lodsb
  24.      cmp al, bl
  25.      jl min
  26.      mov bl, al
  27. min:
  28.      loop gg
  29.  
  30.  
  31.     xor ah, ah
  32.     mov al, bl
  33. ;; если число знаковое, то необходимо расскоментировать следующие строки
  34. ;; Проверяем число на знак.
  35. ;   test    ax, ax
  36. ;   jns     oi1
  37.  
  38. ;; Если оно отрицательное, выведем минус и оставим его модуль.
  39. ;   mov     cx, ax
  40. ;   mov     ah, 02h
  41. ;   mov     dl, '-'
  42. ;   int     21h
  43. ;   mov     ax, cx
  44. ;   neg     ax
  45. ;; Количество цифр будем держать в CX.
  46. ;oi1:  
  47.     xor     cx, cx
  48.     mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
  49. oi2:
  50.     xor     dx,dx
  51.     div     bx
  52. ; Делим число на основание сс. В остатке получается последняя цифра.
  53. ; Сразу выводить её нельзя, поэтому сохраним её в стэке.
  54.     push    dx
  55.     inc     cx
  56. ; А с частным повторяем то же самое, отделяя от него очередную
  57. ; цифру справа, пока не останется ноль, что значит, что дальше
  58. ; слева только нули.
  59.     test    ax, ax
  60.     jnz     oi2
  61. ; Теперь приступим к выводу.
  62.     mov     ah, 02h
  63. oi3:
  64.     pop     dx
  65. ; Извлекаем очередную цифру, переводим её в символ и выводим.
  66. ;; раскоментировать если основание сс > 10, т.е. для вывода требуются буквы
  67. ;   cmp     dl,9
  68. ;   jbe     oi4
  69. ;   add     dl,7
  70. ;oi4:
  71.     add     dl, '0'
  72.     int     21h
  73. ; Повторим ровно столько раз, сколько цифр насчитали.
  74.     loop    oi3
  75.  
  76.   ; пауза.
  77.   xor al, al
  78.   mov ah,01h
  79.   int 21h
  80.    
  81. mov     ah,4ch
  82. int 21h
  83. CodeSG  Ends
  84. END start

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

Список элементов:

  1. StackSG segment - сегмент стека
  2. DataSG segment - сегмент данных
  3. k db 'Max element massiva: $' - переменная k содержит строку Max element massiva: $
  4. array db 70,2,10,4,26 - массив array содержит числа 70, 2, 10, 4, 26
  5. start: - метка начала программы
  6. mov ax, DataSG - перемещение регистра ax в сегмент данных
  7. mov ds, ax - установка сегмента данных равным сегменту стека
  8. mov ah,09 - перемещение регистра ah в 9
  9. mov dx,offset k - перемещение регистра dx в смещение k
  10. int 21h - вызов функции 21h для вывода на экран
  11. mov si, offset array - перемещение регистра si в смещение массива array
  12. xor bx, bx - установка регистра bx в 0
  13. mov cx, 5 - установка регистра cx в 5
  14. gg: lodsb - загрузка байта из массива в регистр al
  15. cmp al, bl - сравнение регистра al с регистром bl
  16. jl min - если регистр al меньше регистра bl, то переход к блоку min
  17. mov bl, al - установка регистра bl равным регистру al
  18. min: loop gg - повторение блока gg до тех пор, пока не будет выполнено условие выхода из цикла
  19. xor ah, ah - установка регистра ah в 0
  20. mov al, bl - установка регистра al равным регистру bl
  21. test ax, ax - проверка регистра ax на ноль
  22. jns oi1 - если регистр ax не равен нулю, то переход к блоку oi1
  23. oi1: xor cx, cx - установка регистра cx в 0
  24. mov bx, 10 - установка регистра bx в 10 (основание системы счисления)
  25. oi2: xor dx,dx - установка регистра dx в 0
  26. div bx - деление регистра ax на регистр bx
  27. push dx - сохранение остатка от деления в стек
  28. inc cx - увеличение регистра cx на 1
  29. test ax, ax - проверка регистра ax на ноль
  30. jnz oi2 - если регистр ax не равен нулю, то повторение блока oi2
  31. mov ah, 02h - установка регистра ah в 2 (код функции вывода на экран)
  32. oi3: pop dx - извлечение значения из стека
  33. add dl, '0' - добавление цифры к регистру dx и преобразование его в символ
  34. int 21h - вызов функции 21h для вывода на экран
  35. loop oi3 - повторение блока oi3 до тех пор, пока не будет выполнено условие выхода из цикла
  36. xor al, al - установка регистра al в 0 (пауза)
  37. mov ah,01h - установка регистра ah в 1 (код функции вывода на экран)
  38. int 21h - вызов функции 21h для вывода на экран
  39. mov ah,4ch - установка регистра ah в 4 (код функции завершения работы программы)
  40. int 21h - вызов функции 21h для завершения работы программы

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


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

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

8   голосов , оценка 3.875 из 5

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

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

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