Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2602
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2264
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1318
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1405
Дата выхода:24.12.2010, 09:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:224 / 67
Вопросов / ответов:1 / 1

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



Вопрос № 181436:

Напишите если не затруднит исходной код на ассемблере : написать программу, вычисляющую значение переменной R при указанных значениях: R=x2+y2,где x=a+b-c, y=b·c-a ; b=8, 106; a=30, 250; c=7, -3!

Отправлен: 18.12.2010, 21:46
Вопрос задал: Посетитель - 353614 (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Посетитель - 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

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 20.12.2010, 02:10
Номер ответа: 264915
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264915 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное