Вычисление целочисленных арифметических выражений - Assembler
Формулировка задачи:
Ребята, помогите пожалуйста. бьюсь уже над задачей пару дней...ничего не выходит...даже не компилирует мой код
Вычислить значение выражения (2*b-a+b*c)/(c/4-1)
На основании данного примера нужно:
(25/c - d + 2)/(d + a*a-1)
буду вам очень признателен
masm .model small .data db "Hello" a1 db 2 ;Переменная a c1 db 2 ;Переменная c d1 db 2 ;Переменная d x1 dw ? Denominator dw ? ;Знаменатель Numerator dw ? ;Числитель .code start: mov ax,@data mov ds,ax ;знаменатель - Denominator ------------------------------------------------ mov al,a1 Imul al ; <ax>=a*a dec ax ; <ax>=a*a-1 ; подготовка к расширению d (BYTE===>WORD) push ax ; Запоминание <ax>=a*a-1 в стеке mov al,d1 CBW ; al ===> AX mov SI,ax ; <SI>=<ax>=d - нужно для ЧИСЛИТЕЛЯ!!! pop bx ;Восстановление содержимого стека ===> <bx>=a*a-1 add bx,ax ; <bx>=a*a-1+d mov Denominator,bx ;числитель - Numerator ---------------------------------------------------- mov ax, 25 IDIV c1 ; <aL>=25/c CBW ; al ===> AX sub ax,SI ; <ax>=25/c-d add ax,2 ; <ax>=25/c-d+2 CWD ; aX ===> DX:AX mov WORD PTR Numerator, AX ; мл. часть числителя mov WORD PTR Numerator+2, DX ; ст. часть числителя ;РЕЗУЛЬТАТ IDIV bx ; <ax>=(25/c-d+2)/(a*a-1+d) mov x1,ax ;ВЫХОДИМ mov ah,4Ch mov al,00h int 21h end start
Решение задачи: «Вычисление целочисленных арифметических выражений»
textual
Листинг программы
.model small .386 .stack 100h .data db "Hello" a1 db 2 ;Переменная a c1 db 2 ;Переменная c d1 db 2 ;Переменная d x1 dw ? ;Denominator dw ? ;Знаменатель ;Numerator dw ? ;Числитель .code start: mov ax,@data mov ds,ax movsx cx, [c1] movsx ax, [d1] movsx bx, [a1] ; divisor mov si, cx sar si, 1 ; c/2 sar si, 1 ; c/4 dec si ; (c/4-1) ; dividiend imul cx, ax ; cx = b*c sal ax, 1 ; 2*b sub ax, bx ; 2*b-a add ax, cx ; ax = 2*b-a+b*c xor dx, dx idiv si mov [x1], ax ;ВЫХОДИМ mov ah,4Ch mov al,00h int 21h end start
Объяснение кода листинга программы
- Установка начального адреса данных в регистре DS
- Загрузка значения переменной
c
в регистр CX - Загрузка значения переменной
d
в регистр AX - Загрузка значения переменной
a
в регистр BX - Вычисление знаменателя (c/2) и сохранение результата в регистре SI
- Вычисление знаменателя (c/4) и сохранение результата в регистре SI
- Уменьшение значения в регистре SI на 1 (получаем (c/4)-1)
- Вычисление числителя (b*c) и сохранение результата в регистре CX
- Увеличение значения в регистре AX на 1 (получаем 2*b)
- Вычитание значения в регистре BX из значения в регистре AX (получаем 2*b-a)
- Добавление значения в регистре CX к значению в регистре AX (получаем ax = 2b-a+bc)
- Очистка регистра DX
- Деление значения в регистре AX на значение в регистре SI
- Сохранение результата деления в регистре AX
- Запись результата в переменную
x
- Выход из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д