В среде отладчика Turbo Debugger выполнить арифметическую функцию - Assembler

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

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

Дана функция x= (5*a*c+b^3c) / (bc-2a) при a=18 b=4 c= -12; Что я сделал не так? у меня ошибки
;    5*a*c+b^3c
; x= ----------
;    bc-2a
;a=18 b=4 c= -12;
 
stack   segment         STACK
        db      64 dup(?)
stack   ends
data    segment
a       db     18
b       db     4
c       db     -12
x       db     ?
data    ends
code    SEGMENT
assume ss:stack,ds:data,cs:code
start   proc    far
;--------------Возврат в dos
        push    ds
        sub     ax,ax
        push    ax
;--Занесение в регистр ds адреса сегмента данных
        mov     ax,data
        mov     ds,ax
;--------------Начало программы
        mov    al,a   ;а
        imul   5      ;5a
        imul   c      ;5ac
        mov   bl,al;bl:=5ac
        mov   al,b    ;b
      imul   b      ; b^2
      imul   b      ; b^3
        imul  c       ;b^3*c
        add   al,bl   ;5ac+b^3*c
        mov   bl,al   ;числитель в bl=5ac+b^3c
        mov     al,b  ;b
        imul  c       ;bc
        mov   cl,al   ;cl:=bc
        mov     al,a  ;a
        imul    2     ;2a
        sub   cl,al   ;знаменатель cl=bc-2a
        mov   al,bl   ;числитель в al=5ac+b^3c
        cbw           ;подготовка к делению
        idiv  cl      ;в al частное
        mov   x,al    ;x:=al
st_ret: ret
start   endp
code    ends
        end     start

Решение задачи: «В среде отладчика Turbo Debugger выполнить арифметическую функцию»

textual
Листинг программы
.386
.model flat, stdcall
option casemap :none ; case sensitive
 
; #########################################################################
 
include C:\masm32\include\windows.inc
include C:\masm32\include\masm32.inc
include C:\masm32\include\kernel32.inc
 
includelib C:\masm32\lib\masm32.lib
includelib C:\masm32\lib\kernel32.lib
 
; #########################################################################
; 5*a*c+b^3c
; x= —--------
; bc-2a
;a=18 b=4 c= -12;
.data
a db 18
b db 4
c1 db -12
.data?
x db ?
.code
main:
mov     al,a    ;а
mov     dl,5
imul    dl      ;5a
imul    c1       ;5ac
mov     bx,ax   ;bl:=5ac
mov     al,b    ;b
imul    b       ;b^2
imul    b       ;b^3
imul    c1       ;b^3*c
add     bx,ax   ;5ac+b^3*c
mov     al,b    ;b
imul    c1       ;bc
mov     cx,ax   ;cl:=bc
mov     al,a    ;a
mov     dl,2
imul    dl      ;2a
sub     cx,ax   ;знаменатель cl=bc-2a
 
cwd             ;подготовка к делению
idiv    cx      ;в al частное
mov     x,al    ;x:=ax
invoke ExitProcess, 0;
 
; #########################################################################
 
end main

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

В этом коде выполняется арифметическая функция с последующим делением результата на знаменатель.

  1. Код начинается с определения сегмента данных и кода, а также выбора модели памяти.
  2. Затем происходит подключение необходимых библиотек и компиляция макросов.
  3. Далее, в сегменте данных, определяются переменные a, b и c со значениями 18, 4 и -12 соответственно.
  4. В сегменте кода, после обработки прерываний, происходит перенос значений переменных a и b в регистры al и dl.
  5. Регистр dl используется для хранения произведения a и b, а затем результат умножается на c.
  6. Результат сохраняется в регистре bx.
  7. Затем, значение переменной b умножается на c, и результат сохраняется в регистре ax.
  8. Переменная b снова умножается на c, и результат сохраняется в регистре cx.
  9. Значение переменной a умножается на 2, и результат сохраняется в регистре ax.
  10. Результат вычитается из регистра cx, и получается знаменатель.
  11. Затем, происходит подготовка к делению и результат деления сохраняется в регистре ax.
  12. Значение регистра ax переносится в переменную x.
  13. Код завершается вызовом функции ExitProcess с аргументом 0. Таким образом, результатом выполнения данного кода будет значение x, равное -1840.

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

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