В среде отладчика 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
Объяснение кода листинга программы
В этом коде выполняется арифметическая функция с последующим делением результата на знаменатель.
- Код начинается с определения сегмента данных и кода, а также выбора модели памяти.
- Затем происходит подключение необходимых библиотек и компиляция макросов.
- Далее, в сегменте данных, определяются переменные a, b и c со значениями 18, 4 и -12 соответственно.
- В сегменте кода, после обработки прерываний, происходит перенос значений переменных a и b в регистры al и dl.
- Регистр dl используется для хранения произведения a и b, а затем результат умножается на c.
- Результат сохраняется в регистре bx.
- Затем, значение переменной b умножается на c, и результат сохраняется в регистре ax.
- Переменная b снова умножается на c, и результат сохраняется в регистре cx.
- Значение переменной a умножается на 2, и результат сохраняется в регистре ax.
- Результат вычитается из регистра cx, и получается знаменатель.
- Затем, происходит подготовка к делению и результат деления сохраняется в регистре ax.
- Значение регистра ax переносится в переменную x.
- Код завершается вызовом функции ExitProcess с аргументом 0. Таким образом, результатом выполнения данного кода будет значение x, равное -1840.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д