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

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

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

Доброго вечера. Допустим, есть готовая программа, находящая max элемент массива. Как его вывести?
StackSG segment 
    dw  1024    dup (?)
StackSG Ends
DataSG  Segment; 
    array db 7,2,10,4,26
    k db 'Max element massiva: $'
DataSG Ends
CodeSG  Segment 
    assume  ss:StackSG,cs:CodeSG,ds:DataSG
 
    start:
mov ax, DataSG
mov ds, ax
mov si, offset array
mov cx, 5
xor bx, bx
mov bl, al
mov ah,09
mov dx,offset k
int 21h
gg: 
     lodsb 
     cmp al, bh
     jg max
     cmp al, bl
     jl min
     jmp away
min: 
     mov bl, al
     jmp away
max:
    mov bh, al
away:
    loop gg
mov     ah,4ch
int 21h
CodeSG  Ends
END start
Прочекал эту тему: http://www.cyberforum.ru/assembler/thread54461.html Перепробовал все, не получилось. Обычно всегда использовал
...
mov ah,09
mov dx,ax
int 21h
...
Хелп, пожалуйста...

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

textual
Листинг программы
StackSG segment 
    dw  1024    dup (?)
StackSG Ends
DataSG  Segment; 
    array db 70,2,10,4,26
    k db 'Max element massiva: $'
DataSG Ends
CodeSG  Segment 
    assume  ss:StackSG,cs:CodeSG,ds:DataSG
 
    start:
mov ax, DataSG
mov ds, ax
 
mov ah,09
mov dx,offset k
int 21h
 
     mov si, offset array
     xor bx, bx
     mov cx, 5
gg: 
     lodsb 
     cmp al, bl
     jl min
     mov bl, al
min:
     loop gg
 
 
    xor ah, ah
    mov al, bl
;; если число знаковое, то необходимо расскоментировать следующие строки
;; Проверяем число на знак.
;   test    ax, ax
;   jns     oi1
 
;; Если оно отрицательное, выведем минус и оставим его модуль.
;   mov     cx, ax
;   mov     ah, 02h
;   mov     dl, '-'
;   int     21h
;   mov     ax, cx
;   neg     ax
;; Количество цифр будем держать в CX.
;oi1:  
    xor     cx, cx
    mov     bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
    xor     dx,dx
    div     bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
    push    dx
    inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
    test    ax, ax
    jnz     oi2
; Теперь приступим к выводу.
    mov     ah, 02h
oi3:
    pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
;; раскоментировать если основание сс > 10, т.е. для вывода требуются буквы
;   cmp     dl,9
;   jbe     oi4
;   add     dl,7
;oi4:
    add     dl, '0'
    int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
    loop    oi3
 
  ; пауза.
  xor al, al
  mov ah,01h
  int 21h
    
mov     ah,4ch
int 21h
CodeSG  Ends
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
Похожие ответы