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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен