Выгрузка из стека в убывающем порядке - Assembler

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

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

Поместить в стек константы длины byte: a = 7(16), b = 15(16), c = 5(16). Извлечь их из стека в убывающем порядке.

Решение задачи: «Выгрузка из стека в убывающем порядке»

textual
Листинг программы
macro pushb [arg]
{
    local stor
    common
        xchg sp,bp
        dec bp
        if arg in <ah,al,aH,aL,bh,bl,bH,bL,ch,cl,cH,cL,dh,dl,dH,dL,Ah,Al,AH,AL,Ch,Cl,CH,CL,Dh,Dl,DH,DL,Bh,Bl,BH,BL>
            mov [ss:bp],arg
        else
            if arg eqtype byte [0x0]
                mov [ss:bp],arg
            else
                if arg eqtype 1
                    mov byte [ss:bp],arg
                else
                    display 'Wrong syntax of pushb'
                    err
                end if
            end if
        end if
        xchg sp,bp
}
macro popb [arg]
{
    local stor
    common
        xchg sp,bp
        if arg in <ah,al,aH,aL,bh,bl,bH,bL,ch,cl,cH,cL,dh,dl,dH,dL,Ah,Al,AH,AL,Ch,Cl,CH,CL,Dh,Dl,DH,DL,Bh,Bl,BH,BL>
            mov arg, [ss:bp]
        else
            if arg eqtype byte [0x0]
                mov arg, [ss:bp]
            else
                display 'Wrong syntax of popb'
                err
            end if
        end if
        inc bp
        xchg sp,bp
}
 
use16
org 100h
    pushb 1
    pushb 2
    pushb 3
    popb al
    popb bl
    popb cl

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

Список действий в коде:

  1. Выполнение макроса pushb 1
    • Проверка типа аргумента (1-й байт).
    • Если аргумент является одним из регистров, то он сохраняется в стеке.
    • Если аргумент является байтом, то он сохраняется в стеке.
    • Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
    • Стек изменяется, чтобы следующий элемент был на вершине.
  2. Выполнение макроса pushb 2
    • Проверка типа аргумента (2-й байт).
    • Если аргумент является одним из регистров, то он сохраняется в стеке.
    • Если аргумент является байтом, то он сохраняется в стеке.
    • Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
    • Стек изменяется, чтобы следующий элемент был на вершине.
  3. Выполнение макроса pushb 3
    • Проверка типа аргумента (3-й байт).
    • Если аргумент является одним из регистров, то он сохраняется в стеке.
    • Если аргумент является байтом, то он сохраняется в стеке.
    • Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
    • Стек изменяется, чтобы следующий элемент был на вершине.
  4. Выполнение макроса popb al
    • Проверка типа аргумента (1-й байт).
    • Если аргумент является одним из регистров, то он извлекается из стека.
    • Если аргумент является байтом, то он извлекается из стека.
    • Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
    • Стек изменяется, чтобы следующий элемент был на вершине.
  5. Выполнение макроса popb bl
    • Проверка типа аргумента (2-й байт).
    • Если аргумент является одним из регистров, то он извлекается из стека.
    • Если аргумент является байтом, то он извлекается из стека.
    • Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
    • Стек изменяется, чтобы следующий элемент был на вершине.
  6. Выполнение макроса popb cl
    • Проверка типа аргумента (3-й байт).
    • Если аргумент является одним из регистров, то он извлекается из стека.
    • Если аргумент является байтом, то он извлекается из стека.
    • Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
    • Стек изменяется, чтобы следующий элемент был на вершине.

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

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