Консультация № 189138
09.04.2016, 10:31
0.00 руб.
1 13 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Вычислить значения в уравнение. Ассемблер TASM. Платформа Windows.


Прикрепленные файлы:
e73f698ac28da274c4fdd27370733cf1580d2ef3.docx

Обсуждение

давно
Посетитель
400178
6
11.04.2016, 11:37
общий
12.04.2016, 08:50
[code lang=asm h=150]data segment
y db 0
data ends
st segment stack ‘stack’
db 128 dup(?)
st ends
assume cs: code, ds: data, ss: st
code segment
start:
Y dw 0

mov ax,49
mov bx,7
cwd
div bx
mov [Y],ax
Y DW 0
mov ax,42
mov bx,6
cwd
div bx
mov [Y],ax
mov ax,7
add ax,7
[/code]
давно
Посетитель
7438
7205
11.04.2016, 11:51
общий
Адресаты:
Уже хорошо! Ошибки есть, конечно.. Но это не страшно! Подправим!
Все же, почему не до конца? Давайте-давайте пишите...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400178
6
11.04.2016, 13:07
общий
12.04.2016, 08:51
[code lang=asm h=200]data segment
y db 0
data ends
st segment stack ‘stack’
db 128 dup(?)
st ends
assume cs: code, ds: data, ss: st
code segment
start:
Y dw 0

mov ax,49
mov bx,7
cwd
div bx
mov [Y],ax
Y DW 0
mov ax,42
mov bx,6
cwd
div bx
mov [Y],ax
mov ax,7
add ax,7
Y dw 0
mov ax,6
mov bx,2
cwd
mul bx
mov [Y],ax
mov ax,14
add ax,12
Y dw 0
mov ax,8
mov bx,5
cwd
mul bx
mov [Y],ax
Y dw 0
mov ax,40
mov bx,9
div bx
mov [Y],ax
Y dw 0
mov ax,4
mov bx,6
mul bx
mov [Y],ax
mov ax,40/9
sub bx,24
Y dw 0
mov ax,26
mov bx,40/9-24
div bx
mov [Y],ax
mov ax,23
add bx,12
mov ax,26
sub bx,4
Y dw 0
mov ax,35
mov bx,22
div bx
mov [Y],ax
mov ax,35/22
mov bx,5
mul bx
mov [Y],ax
mov ax,40/9-24
add bx,35/22*5
mov ax,4c00h
int 21h
code ends
end start[/code]
давно
Посетитель
400178
6
12.04.2016, 09:09
общий
а какие комментарии будут к этому коду программы?
давно
Посетитель
7438
7205
12.04.2016, 16:09
общий
это ответ
Здравствуйте, vsib2012!
Исправленная программа
Посмотрите сначала самостоятельно.
Если будет что-то непонятно, потом напишу комментарии
[code lang=asm h=200]
data segment
sRes db 'Y = $'
y dw 0 ;здесь будет результат
data ends

_stack segment stack 'stack'
dw 128 dup(?) ;стек лучше задавать не байтами, а словами
_stack ends

assume cs:code, ds:data, ss:_stack
code segment
start:
mov ax, data
mov ds, ax

mov ax,49 ;ax = 49
mov bx,7
cwd ;dx:ax = 49
idiv bx ;ax = dx:ax / bx = 49 / 7, остаток dx игнорируем
mov si,ax ;сохраним в si

mov ax,42 ;ax = 42
mov bx,6
cwd ;dx:ax = 42
idiv bx ;ax = dx:ax / bx = 42 / 7, остаток dx игнорируем
add si,ax ;si = 49/7 + 42/7

mov ax,6 ;ax = 6
mov bx,2
imul bx ;dx:ax = 6*2, старшее слово в dx игнорируем
add si,ax ;si = 49/7 + 42/7 + 6*2

mov ax,8 ;ax = 8
mov bx,5
mul bx ;dx:ax = 8*5
mov bx,9
idiv bx ;ax = 8*5/9, остаток dx игнорируем
mov di,ax ;сохраним в di

mov ax,4 ;ax = 4
mov bx,6
imul bx ;dx:ax = 4*6, старшее слово в dx игнорируем
sub di,ax ;di = 8*5/9 - 4*6

mov ax,si ;ax = 49/7 + 42/7 + 6*2
cwd ;dx:ax = 49/7 + 42/7 + 6*2
div di ;ax = (49/7 + 42/7 + 6*2) / (8*5/9 - 4*6), остаток dx игнорируем

mov si, ax ;сохраним в si

mov ax,23 ;ax = 23
add ax,12 ;ax = 23+12
mov bx,26 ;bx = 26
sub bx,4 ;bx = 26-4
cwd ;dx:ax = 23+12
div bx ;ax = (23+12)/(26-4), остаток dx игнорируем

mov bx,5
mul bx ;dx:ax = ((23+12)/(26-4))*5

add ax, si ;ax = ((49/7+42/7+6*2)/(8*5/9-4*6))+((23+12)/(26-4))*5
mov [Y],ax ;сохраним результат

;выведем результат из ax
push ax ;сохраним число в стеке
mov ah, 9
lea dx, sRes
int 21h ;выводим сообщение
pop ax

mov bx, 10 ;система счисления
xor cx, cx ;счетчик в стеке
test ax, ax ;проверим на знак числа
jge div_loop ;>=0 просто выводим
neg ax ;ax = -ax
push ax ;сохраним
mov dl, '-' ;выведем знак минуса
mov ah, 2
int 21h
pop ax
div_loop: ;цикл получения цифр делением на 10
xor dx,dx
div bx ;получаем младшую цифру
push dx ;запоминаем в стеке
inc cx ;считаем
test ax,ax ;повторяем пока не ноль в ах
jnz div_loop

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
code ends
end start
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
13.04.2016, 11:40
общий
Адресаты:

И зачем всех модераторов звать?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Мастер-Эксперт
17387
18345
13.04.2016, 11:52
общий
Адресаты:
Пожалуйста, правильно выбирайте адресатов для своих сообщений. Не нужно обращаться к модераторам портала с просьбой написать комментарии к программному коду. Для это нужно обратиться к автору программного кода.
Об авторе:
Facta loquuntur.
давно
Посетитель
7438
7205
13.04.2016, 12:45
общий
Адресаты:
Добавил комментарии...
Слать сообщение надо тому, кому адресовано!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400178
6
13.04.2016, 13:17
общий
Адресаты:
Спасибо большое!
давно
Посетитель
400178
6
13.04.2016, 13:20
общий
Адресаты:
как сделать так чтобы ответ выявлялся, а то он только сворачивается?
давно
Посетитель
7438
7205
13.04.2016, 13:30
общий
Адресаты:
Т.е., хотите, чтобы ответ показался на экране и экран не пропадал до нажатия на клавишу?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.04.2016, 13:39
общий
Адресаты:
Добавил инициализацию регистра сегмента данных, вывод числа и ожидание нажатия на клавишу
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400178
6
13.04.2016, 19:01
общий
Адресаты:
Спасибо!
Форма ответа