Вывод числа - Assembler
Формулировка задачи:
Доброго вечера.
Допустим, есть готовая программа, находящая max элемент массива. Как его вывести?
Прочекал эту тему: http://www.cyberforum.ru/assembler/thread54461.html
Перепробовал все, не получилось.
Обычно всегда использовал
Хелп, пожалуйста...
Листинг программы
- 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
Листинг программы
- ...
- 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
Объяснение кода листинга программы
Список элементов:
- StackSG segment - сегмент стека
- DataSG segment - сегмент данных
- k db 'Max element massiva: $' - переменная k содержит строку
Max element massiva: $
- array db 70,2,10,4,26 - массив array содержит числа 70, 2, 10, 4, 26
- start: - метка начала программы
- mov ax, DataSG - перемещение регистра ax в сегмент данных
- mov ds, ax - установка сегмента данных равным сегменту стека
- mov ah,09 - перемещение регистра ah в 9
- mov dx,offset k - перемещение регистра dx в смещение k
- int 21h - вызов функции 21h для вывода на экран
- mov si, offset array - перемещение регистра si в смещение массива array
- xor bx, bx - установка регистра bx в 0
- mov cx, 5 - установка регистра cx в 5
- gg: lodsb - загрузка байта из массива в регистр al
- cmp al, bl - сравнение регистра al с регистром bl
- jl min - если регистр al меньше регистра bl, то переход к блоку min
- mov bl, al - установка регистра bl равным регистру al
- min: loop gg - повторение блока gg до тех пор, пока не будет выполнено условие выхода из цикла
- xor ah, ah - установка регистра ah в 0
- mov al, bl - установка регистра al равным регистру bl
- test ax, ax - проверка регистра ax на ноль
- jns oi1 - если регистр ax не равен нулю, то переход к блоку oi1
- oi1: xor cx, cx - установка регистра cx в 0
- mov bx, 10 - установка регистра bx в 10 (основание системы счисления)
- oi2: xor dx,dx - установка регистра dx в 0
- div bx - деление регистра ax на регистр bx
- push dx - сохранение остатка от деления в стек
- inc cx - увеличение регистра cx на 1
- test ax, ax - проверка регистра ax на ноль
- jnz oi2 - если регистр ax не равен нулю, то повторение блока oi2
- mov ah, 02h - установка регистра ah в 2 (код функции вывода на экран)
- oi3: pop dx - извлечение значения из стека
- add dl, '0' - добавление цифры к регистру dx и преобразование его в символ
- int 21h - вызов функции 21h для вывода на экран
- loop oi3 - повторение блока oi3 до тех пор, пока не будет выполнено условие выхода из цикла
- xor al, al - установка регистра al в 0 (пауза)
- mov ah,01h - установка регистра ah в 1 (код функции вывода на экран)
- int 21h - вызов функции 21h для вывода на экран
- mov ah,4ch - установка регистра ah в 4 (код функции завершения работы программы)
- int 21h - вызов функции 21h для завершения работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д