Простые математические действия - Assembler/emu8086
Формулировка задачи:
Нужно посчитать и вывести в консоль в виде "answer="
Переменные задаются в сегменте данных.
1)(6+A)/B-C, (A+D-B) *E
2)1+(A*B)-C/3, (A+B-C) *(D+E)
Вот эти 2 вычисления помогите, что то не понимаю
Решение задачи: «Простые математические действия»
textual
Листинг программы
.model small .stack 100h .data msg1 db '(6+A)/B-C = ', '$' msg2 db '(A+D-B)*E = ', '$' msg3 db '1+(A*B)-C/3 = ', '$' msg4 db '(A+B-C)*(D+E) = ', '$' CrLf db 0Dh, 0Ah, '$' msgPressAnyKey db 'Press any key to exit...', '$' A dw 100 B dw -20 C dw 56 D dw -8 E dw 77 Res1 dw ? Res2 dw ? Res3 dw ? Res4 dw ? .code main proc ;инициализация сегментного регистра ds адресом сегмента данных mov ax, @data mov ds, ax ;1. (6+A)/B-C mov ax, 6 add ax, [A] cwd idiv [B] sub ax, [C] mov [Res1], ax mov ah, 09h lea dx, [msg1] int 21h mov ax, [Res1] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h ;2. (A+D-B)*E mov ax, [A] add ax, [D] sub ax, [B] imul [E] mov [Res2], ax mov ah, 09h lea dx, [msg2] int 21h mov ax, [Res2] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h ;3. 1+(A*B)-C/3 mov ax, [A] imul [B] add ax, 1 mov bx, ax mov ax, [C] cwd mov cx, 3 idiv cx sub bx, ax mov [Res3], bx mov ah, 09h lea dx, [msg3] int 21h mov ax, [Res3] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h ;4. (A+B-C)*(D+E) mov ax, [A] add ax, [B] sub ax, [C] mov bx, [D] add bx, [E] imul bx mov [Res4], ax mov ah, 09h lea dx, [msg4] int 21h mov ax, [Res4] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h ;ожидание нажатия любой клавиши mov ah, 09h lea dx, [msgPressAnyKey] int 21h mov ah, 00h int 16h mov ax, 4C00h int 21h main endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ; выводим из стека на экран @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
Объяснение кода листинга программы
Код выполняет простые математические операции и выводит результаты на экран. Список действий:
- Инициализация сегментного регистра ds адресом сегмента данных.
- Подготовка переменных для операций: A, B, C, D, E, Res1, Res2, Res3, Res4.
- Выполнение первой операции: (6+A)/B-C. Результат сохраняется в переменной Res1.
- Вывод результата первой операции на экран.
- Выполнение второй операции: (A+D-B)*E. Результат сохраняется в переменной Res2.
- Вывод результата второй операции на экран.
- Выполнение третьей операции: 1+(A*B)-C/3. Результат сохраняется в переменной Res3.
- Вывод результата третьей операции на экран.
- Выполнение четвертой операции: (A+B-C)*(D+E). Результат сохраняется в переменной Res4.
- Вывод результата четвертой операции на экран.
- Ожидание нажатия любой клавиши. Программа использует регистры AX, BX, CX, DX, SI и DI для выполнения операций. При выполнении операций с числами, результат выводится на экран с использованием символов для разделения десятичных разрядов и знака минус.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д