Вывод числа - 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 для завершения работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д