Консультация № 181436
18.12.2010, 21:46
0.00 руб.
18.12.2010, 22:00
0 2 1
Напишите если не затруднит исходной код на ассемблере : написать программу, вычисляющую значение переменной R при указанных значениях: R=x2+y2,где x=a+b-c, y=b·c-a ; b=8, 106; a=30, 250; c=7, -3!

Обсуждение

давно
Посетитель
7438
7205
18.12.2010, 23:05
общий
Уточните, пожалуйста, у Вас a, b, c равны двум числам, перечисленным через запятую.
Как это понимать? Требуется найти 8 значений для разных комбинаций a, b, c? Или как-то по другому?
Кроме того, Вы не указали процессор и ОС, предполагаем х86 и ДОС
Плюс формат COM и ассемблер TASM. Так?

PS Вы оригинально поместили вопрос по ассемблеру в рассылку по истории науки и техники
Впрочем, я догадываюсь почему... Хотели сэкономить? Ну-ну...
Вот я теперь и думаю, отвечать Вам или нет...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.12.2010, 02:10
общий
это ответ
Здравствуйте, Посетитель - 353614!
Вот Вам программа... Будут вопросы - обращайтесь в мини-форум
Код:
;написать программу, вычисляющую значение переменной R при указанных значениях:
;R=x2+y2,где x=a+b-c, y=b*c-a ; b=8, 106; a=30, 250; c=7, -3
.model tiny, C
.data
a dw 30, 250 ;значения параметров
b dw 8, 106
c dw 7, -3
sA db 'a=$' ;строки для вывода значений
sB db ', b=$'
sC db ', c=$'
sR db ', R=$'
sPress db 0ah,'Press any key$'

.code
.186 ;чтобы работало push <число>
.startup ;точка входа

;расчет по всем возможным комбинациям параметров
call CalcR, a, b, c
call CalcR, a, b, c+2
call CalcR, a, b+2, c
call CalcR, a, b+2, c+2
call CalcR, a+2, b, c
call CalcR, a+2, b, c+2
call CalcR, a+2, b+2, c
call CalcR, a+2, b+2, c+2

lea dx, sPress
mov ah, 9
int 21h

mov ah, 8
int 21h

mov ax, 4c00h
int 21h

;вывод строки и числа numHi:numLo
PrintNum proc string:word, numLo:word, numHi:word
mov dx, string
mov ah, 9
int 21h ;строка
mov ax, numLo
mov dx, numHi ;dx:ax - dword
test dx, dx ;проверим знак
jns PrNumStart ;положительное - просто выводим
push ax ;отрицательное
mov al, '-'
int 29h ;выведем минус
pop ax ;и возьмем модуль числа
not ax
not dx
add ax, 1
adc dx, 0
PrNumStart:
mov bx, 10 ;будем делить на 10
xor cx, cx ;счетчик цифр
PrNumDiv:
xor dx, dx ;подготовимся к делению
div bx ;делим DX:AX на BX
push dx ;сохраним в стеке остаток от деления - очередную цифру
inc cx ;считаем
or ax, ax ;проверим, надо ли продолжать
jnz PrNumDiv
PrNumOut:
pop ax ;извлекаем из стека очередную цифру (в обратном порядке)
add al, '0' ;делаем из числа 0-9 символ '0'-'9'
int 29h
LOOP PrNumOut ;по всем цифрам
ret
PrintNum endp

;расчет R при значениях A, B, C
CalcR proc wA:word, wB:word, wC:word
mov ax, wA
cwd ;dx:ax - знаковое число
call PrintNum, offset sA, ax, dx ;выведем
mov ax, wB
cwd
call PrintNum, offset sB, ax, dx
mov ax, wC
cwd
call PrintNum, offset sC, ax, dx
call CalcX, wA, wB, wC ;считаем ax = X
imul ax ;ax = ax * ax
mov si, ax ;сохраним dword
mov di, dx
call CalcY, wA, wB, wC ;считаем ax = Y
imul ax ;ax = ax * ax
add ax, si ;сложим с предыдущим
adc dx, di
call PrintNum, offset sR, ax, dx ;выведем R
mov al, 0dh
int 29h ;на новую строку
mov al, 0ah
int 29h
ret
CalcR endp

;расчет X
CalcX proc wA:word, wB:word, wC:word
mov ax, wA
add ax, wB
sub ax, wC ;ax = a + b - c
ret
CalcX endp

;расчет Y
CalcY proc wA:word, wB:word, wC:word
mov ax, wB
imul wC
sub ax, wA ;ax = b * c - a
ret
CalcY endp

end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа