[FASM] Вывести значение регистра на консоль - Assembler
Формулировка задачи:
Нужно вывести значение регистра cl на консоль. Собственно сама задача заключается в том, чтобы подсчитать сумму элементов, расположенных до максимального значения, но с этим вроде проблем не возникло. FASM.
org 100h Start: mov al, byte[Array] mov bx, 1 Back: cmp byte[Array+bx], al jg Max Back2: inc bx cmp bx, 10 jne Back mov bx, 0 Back3: cmp byte[Array+bx], al jl Sum Back4: inc bx cmp byte[Array+bx], al jne Back3 mov ah, 08 int 21h ret ;------------------------------------ Array db 2,4,1,1,8,2,3,4,7,2 Max: mov al, byte[Array+bx] jmp Back2 Sum: add cl, byte[Array+bx] jmp Back4
Решение задачи: «[FASM] Вывести значение регистра на консоль»
textual
Листинг программы
org 100h Start: lea si, [Array] mov cx, 10 dec cx mov ah, [si] inc si @@FindMax: lodsb cmp ah, al jge @@Next mov ah, al @@Next: loop @@FindMax lea si, [Array] mov cx, 10 mov bx, 0 @@Sum: lodsb cmp ah, al je @@Break add bl, al jmp @@Sum @@Break: mov al, bl aam add ax, 3030h mov dl,ah mov dh,al mov ah, 02 int 21h mov dl, dh int 21h mov ah, 08 int 21h int 20h ;------------------------------------ Array db 2,4,1,2,8,2,3,4,7,2 ;------------------------------------
Объяснение кода листинга программы
- org 100h — инициализация сегмента
- Start: — начало работы программы
- lea si, [Array] — загрузка индекса в регистр si из диапазона от 0 до 9
- mov cx, 10 — инициализация счётчика циклов в регистре cx
- dec cx — уменьшение счётчика циклов на единицу
- mov ah, [si] — загрузка значения элемента массива в регистр ah
- inc si — увеличение индекса на единицу
- @@FindMax: — начало цикла поиска максимального значения
- lodsb — загрузка байта из памяти в регистр al
- cmp ah, al — сравнение регистров ah и al
- jge @@Next — переход к следующей итерации, если значение регистра ah больше или равно значению регистра al
- mov ah, al — запоминание значения регистра al в регистре ah
- @@Next: — переход к следующей итерации
- loop @@FindMax — окончание цикла
- lea si, [Array] — загрузка индекса в регистр si из диапазона от 0 до 9
- mov cx, 10 - инициализация счётчика циклов в регистре cx
- mov bx, 0 - инициализация регистра bx нулём
- @@Sum: — начало цикла суммирования
- lodsb — загрузка байта из памяти в регистр al
- cmp ah, al — сравнение регистров ah и al
- je @@Break — переход к следующей итерации, если значение регистра ah равно значению регистра al
- add bl, al — суммирование значения регистра bl и значения регистра al
- jmp @@Sum — переход к следующей итерации цикла
- @@Break: — окончание цикла суммирования
- mov al, bl — запоминание значения регистра bl в регистре al
- aam - деление значения регистра ax на 10
- add ax, 3030h — получение значения 3030 в результате вычисления (1000 + 2000)
- mov dl,ah — загрузка младшего байта результата в регистр dl
- mov dh,al — загрузка старшего байта результата в регистр dh
- mov ah, 02 - подготовка к выводу значения регистра dh на экран
- int 21h - вывод значения регистра dh на экран
- mov dl, dh - замена регистра dl значением регистра dh
- int 21h - вывод значения регистра dl на экран
- int 20h — завершение работы программы ;------------------------------------ Array db 2,4,1,2,8,2,3,4,7,2 ;------------------------------------ Массив содержит 10 элементов, каждый из которых является байтом. Значения элементов массива: 2, 4, 1, 2, 8, 2, 3, 4, 7, 2
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д