Консультация № 189134
09.04.2016, 10:15
0.00 руб.
1 3 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Помогите пожалуйста написать код в ассемблере.
Прикрепленные файлы:
5129afbdc3b249783c95b4b96eafc893bc87dbdd.jpg

Обсуждение

давно
Посетитель
7438
7205
11.04.2016, 01:34
общий
Адресаты:
Считать в целочисленной арифметике или в вещественной?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400169
1
11.04.2016, 10:14
общий
Цитата: Лысков Игорь Витальевич
[q=7438]
[/q]
целочисленной
давно
Посетитель
7438
7205
11.04.2016, 11:15
общий
это ответ
Здравствуйте, shenae2009!
Вот и программа...
[code lang=asm h=200]
.model small
.data
;числа-константы из формулы
C24 dw 34
C4 dw 4
C5 dw 5
C6 dw 6
C36 dw 36
C37 dw 37
C8 dw 8
C3 dw 3
C2 dw 2

sRes db 10,13,'Result: $'

.stack 100h ;стек

.code ;сегмент кода
start: mov ax, @data
mov ds, ax ;настраиваем сегментный регистр данных

mov ax, С24 ;24
mov bx, C4 ;4
xor dx, dx ;готовимся к делению
idiv bx ;ax = dx:ax/bx = 24/4, остаток в dx отбрасываем
mov di, ax ;сохраним в di

mov ax, C5 ;5
imul C6 ;dx:ax = 5*6
add ax, di ;dx:ax = 5*6 + 24/4
adc dx, 0 ;на всякий случай, учтем перенос
div C36 ;ax = dx:ax / 36
mov di, ax ;сохраним в di, остаток отбрасываем

;посчитаем вторую половину формулы
mov ax, C8 ;8
imul C6 ;dx:ax = 8*6
add ax, C5 ;dx:ax = 8*6 + 5
adc dx, 0 ;учитываем возможный перенос
div C3 ;ax = dx:ax / 3
mov si, ax ;сохнаним частное, остаток в dx отбрасываем

mov ax, C3 ;3
imul C2 ;dx:ax = 3*2, старшее слово отбрасываем
add si, ax ;si = (8*6+5)/3 + 3*2

mov ax, C8 ;8
xor dx, dx ;dx:ax = 8
div C2 ;ax = dx:ax / 2, остаток в dx отбрасываем
add ax, C3 ;ax = 8/2 +3
imul C37 ;dx:ax = 37 * (8/2 +3)

idiv si ;ax = dx:ax / si = (37 * (8/2 +3)) / ((8*6+5)/3 + 3*2)

add ax, di ;в ax окончательный резльтат

;выведем результат
mov bx, 10 ;система счисления
xor cx, cx ;счетчик в стеке
div_loop:
xor dx,dx
div bx ;получаем младшую цифру
push dx ;запоминаем в стеке
inc cx ;считаем
test ax,ax ;повторяем пока не ноль в ах
jnz div_loop

mov ah, 9
lea dx, sRes
int 21h ;выводим сообщение
dig_loop:
pop dx ;извлекаем цифру
add dl,'0' ;переводим в символ
mov ah, 2
int 21h ;выводим на экран
loop dig_loop

xor ax, ax ;ожидаем любую клавишу
int 16h

mov ax, 4C00h ;выход
int 21h
end start
[/code]
5
Спасибо большое, очень выручили!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа