Вычислить значение выражения - Assembler (247694)
Формулировка задачи:
Здравствуйте,прошу помочь с Ассемблером.
Задание:Вычислить значение выражения.
Выписать состояние регистров,каждый раз при выполнении очередной инструкции.
Заранее спасибо за помощь.
Решение задачи: «Вычислить значение выражения»
textual
Листинг программы
LOCALS .model small .stack 100h .data .code main proc mov ax, @data mov ds, ax ;cx=(-15/6) mov ax, -15 mov bx, 6 cwd idiv bx mov cx, ax ;cx=cx+(34+7*2)*2 mov ax, 7 mov bx, 2 imul bx add ax, 34 imul bx add cx, ax ;bx=16+13/8 mov ax, 13 mov bx, 8 cwd idiv bx add ax, 16 mov bx, ax ;cx/bx mov ax, cx cwd idiv bx ;ax=cx/bx-14 sub ax, 14 mov ax, 4C00h int 21h main endp end main
Объяснение кода листинга программы
- LOCALS - это метка, которая указывает на то, что следующие области памяти будут использоваться в текущей функции.
- .model small - это директива, которая определяет размер стека и регистрового окна. В данном случае стек будет 100 байт, а регистровое окно - 16 байт.
- .stack 100h - это директива, которая определяет размер стека в байтах.
- .data - это секция, в которой хранятся данные, используемые в программе.
- .code - это секция, в которой хранятся коды программы.
- main proc - это метка, которая определяет начало функции main.
- mov ax, @data - это команда, которая загружает в регистр ax адрес области данных.
- mov ds, ax - это команда, которая связывает сегмент данных с сегментом кода.
- mov ax, -15 - это команда, которая загружает в регистр ax значение -15.
- mov bx, 6 - это команда, которая загружает в регистр bx значение 6.
- cwd - это команда, которая переключает сегмент регистра ax в режим двоичного счисления.
- idiv bx - это команда, которая делит значение регистра ax на значение регистра bx и сохраняет результат в регистре ax и остаток в регистре dx.
- mov cx, ax - это команда, которая загружает в регистр cx значение из регистра ax.
- mov ax, 7 - это команда, которая загружает в регистр ax значение 7.
- mov bx, 2 - это команда, которая загружает в регистр bx значение 2.
- imul bx - это команда, которая умножает значение регистра ax на значение регистра bx и сохраняет результат в регистре ax.
- add ax, 34 - это команда, которая прибавляет к значению регистра ax значение 34.
- imul bx - это команда, которая умножает значение регистра ax на значение регистра bx и сохраняет результат в регистре ax.
- add cx, ax - это команда, которая прибавляет к значению регистра cx значение из регистра ax.
- mov ax, 13 - это команда, которая загружает в регистр ax значение 13.
- mov bx, 8 - это команда, которая загружает в регистр bx значение 8.
- cwd - это команда, которая переключает сегмент регистра ax в режим двоичного счисления.
- idiv bx - это команда, которая делит значение регистра ax на значение регистра bx и сохраняет результат в регистре ax и остаток в регистре dx.
- add ax, 16 - это команда, которая прибавляет к значению регистра ax значение 16.
- mov bx, ax - это команда, которая загружает в регистр bx значение из регистра ax.
- mov ax, cx/bx - это команда, которая загружает в регистр ax результат деления значения регистра cx на значение регистра bx.
- sub ax, 14 - это команда, которая вычитает из значения регистра ax значение 14.
- mov ax, 4C00h - это команда, которая загружает в регистр ax значение 4C00h.
- int 21h - это команда, которая выполняет interrupt 21h, что приводит к выходу из программы.