Задать массив символов - Assembler

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

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

Помогите, плиз! Нужно написать программу, которая задает массив символов размер которого вводим вручную, а затем сложить все элементы по очереди, причем нужно ограничить массив вот этими символами "$$", т. е. грубо говоря поочередно нужно складывать числа массива и сравнивать с "$$", и если не совпадает продолжать сложение, а если совпадает соответственно закончить и вывести на экран. Не спрашивайте почему все так сложно, придумал препод.

Решение задачи: «Задать массив символов»

textual
Листинг программы
.model small
.286
.data
array db 1,2,3,4,5,6,7,8,9,"$"      ;инициализируем массив.
message db  ''
string db 10 dup ('0'),'$'
S   db  091h, '$'
U   db  093h, '$'
M   db  08Ch, '$'
A   db  080h, '$'
Q   db  000h, '$'
I   db  088h, '$'
V   db  082h, '$'
R   db  03Dh, '$'
 
.stack 100h
.code
start:  mov ax,@data
    mov ds,ax
    mov ax,3; чистим экран
    int 10h
    xor ax,ax
    xor bx,bx
    mov si,offset array         ;загружаем в ESI начало массива 
again:  
    lodsb
     cmp al,"$"             ;AL равен нулю? 
    jz sagain                   ;переходим к again, если AL не О
    
                ;mov al,[esi]  
                ;загружаем в AL элемент массива 
                ;inc esi                 
                ;перемещаем указатель на след. элемент 
    add bx,ax               ;ВХ = ВХ + АХ
 
    jmp again
    
sagain:
   
    mov si,offset string+9  ; в конец строки
    mov ax,bx
    mov bl,10
a1: div bl
    add [si],ah         ; остаток в строку
    dec si          ; двигаемся к началу строки
    mov ah,0
    test ax,ax  
        ; делить больше нечего?
    jnz a1          ; тогда на выход
        mov dx,offset S ; выводим результат на экран
    mov ah,9
    int 21h
    mov dx,offset U
    mov ah,9
    int 21h
    mov dx,offset M
    mov ah,9
    int 21h
    mov dx,offset M
    mov ah,9
    int 21h
    mov dx,offset A
    mov ah,9
    int 21h
    mov dx,offset Q
    mov ah,9
    int 21h
    mov dx,offset M
    mov ah,9
    int 21h
    mov dx,offset A
    mov ah,9
    int 21h
    mov dx,offset S
    mov ah,9
    int 21h
    mov dx,offset S
    mov ah,9
    int 21h
    mov dx,offset I
    mov ah,9
    int 21h
    mov dx,offset V
    mov ah,9
    int 21h
    mov dx,offset A
    mov ah,9
    int 21h 
    mov dx,offset R
    mov ah,9
    int 21h
        mov dx,offset message
    mov ah,9
    int 21h
    mov ah,0            ;ждем пока не нажмут на клавиатуру
    int 16h
    mov ah,4Ch          ; выходим из программы
    int 21h 
end start

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

Код разделён на два логических блока: инициализация данных и основной цикл. В начальной части кода подключается библиотека для работы с клавиатурой и экраном (int 10h), инициализируется стек (pusha), а также задаётся начальный адрес массива в регистре ESI. Основной цикл содержит условие для цикла, который выполняется, пока в AL не станет равным нулю, после чего выполняется переход на другой участок кода. В данном случае это означает, что мы достигли конца строки. После этого выполняется обработка символа, полученного из массива: он добавляется в строку, после чего увеличивается указатель на следующий символ в строке. После выполнения основного цикла выполняется обработка символов, полученных из массива: они выводятся на экран с помощью функции int 21h, которая выводит символ на экран. В конце кода выполняется выход из программы с помощью функции int 21h.

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

11   голосов , оценка 4.091 из 5
Похожие ответы