Выгрузка из стека в убывающем порядке - 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
Объяснение кода листинга программы
Список действий в коде:
- Выполнение макроса pushb 1
- Проверка типа аргумента (1-й байт).
- Если аргумент является одним из регистров, то он сохраняется в стеке.
- Если аргумент является байтом, то он сохраняется в стеке.
- Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
- Стек изменяется, чтобы следующий элемент был на вершине.
- Выполнение макроса pushb 2
- Проверка типа аргумента (2-й байт).
- Если аргумент является одним из регистров, то он сохраняется в стеке.
- Если аргумент является байтом, то он сохраняется в стеке.
- Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
- Стек изменяется, чтобы следующий элемент был на вершине.
- Выполнение макроса pushb 3
- Проверка типа аргумента (3-й байт).
- Если аргумент является одним из регистров, то он сохраняется в стеке.
- Если аргумент является байтом, то он сохраняется в стеке.
- Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
- Стек изменяется, чтобы следующий элемент был на вершине.
- Выполнение макроса popb al
- Проверка типа аргумента (1-й байт).
- Если аргумент является одним из регистров, то он извлекается из стека.
- Если аргумент является байтом, то он извлекается из стека.
- Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
- Стек изменяется, чтобы следующий элемент был на вершине.
- Выполнение макроса popb bl
- Проверка типа аргумента (2-й байт).
- Если аргумент является одним из регистров, то он извлекается из стека.
- Если аргумент является байтом, то он извлекается из стека.
- Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
- Стек изменяется, чтобы следующий элемент был на вершине.
- Выполнение макроса popb cl
- Проверка типа аргумента (3-й байт).
- Если аргумент является одним из регистров, то он извлекается из стека.
- Если аргумент является байтом, то он извлекается из стека.
- Если аргумент не соответствует ни одному из условий, выводится сообщение об ошибке.
- Стек изменяется, чтобы следующий элемент был на вершине.