13.05.2016, 14:52
общий
это ответ
Здравствуйте, yasha190!
Держите три программки...
[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, 4 ;ax = 4
cwd ;dx:ax = 4
mov bx, 2
idiv bx ;ax = 4/2, dx отбрасываем
mov di, 17
sub di, ax ;di = 17-4/2
mov ax, 14 ;ax = 14
mov bx, 5
imul bx ;dx:ax = 14*5
add ax, 37
adc dx, 0 ;dx:ax = 37+14*5
mov bx, 2
idiv bx ;ax = (37+14*5)/2, остаток в dx отбрасываем
mov si, bx ;si = ax = (37+14*5)/2
mov ax, 5
mov bx, 6
imul bx ;dx:ax = 5*6
add ax, si ;ax = (37+14*5)/2+5*6
cwd ;dx:ax = (37+14*5)/2+5*6
idiv di ;ax = ((37+14*5)/2+5*6)/(17-4/2), dx отбрасываем
mov di, ax ;di = ((37+14*5)/2+5*6)/(17-4/2)
mov ax, 5 ;ax = 5
mov bx, 4
imul bx ;dx:ax = 5*4, dx отбрасываем
add ax, di ;ax = ((37+14*5)/2+5*6)/(17-4/2) + 5*4
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]
[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, 36 ;ax = 36
cwd ;dx:ax = 36
mov bx, 4
idiv bx ;ax = 36/4, dx отбрасываем
mov di, ax ;di = 36/4
mov ax, 35 ;ax = 35
cwd ;dx:ax = 35
mov bx, 8
idiv bx ;ax = 35/8, dx отбрасываем
add di, ax ;di = 36/4 + 35/8
mov ax, 15
sub ax, 7
cwd ;dx:ax = 15-7
mov bx, 2
imul bx ;dx:ax = (15-7)*2
add ax, 34
adc dx, 0 ;dx:ax = 34+(15-7)*2
idiv di ;ax = (34+(15-7)*2)/(36/4+35/8), dx отбрасываем
mov di, ax ;di = (34+(15-7)*2)/(36/4+35/8)
mov ax, 34 ;ax = 34
mov bx, 2
imul bx ;dx:ax = 34*2
xchg ax, di ;ax = (34+(15-7)*2)/(36/4+35/8), di = 34*2
sub ax, di ; ax = (34+(15-7)*2)/(36/4+35/8) - 34*2
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]
[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, 4 ;ax = 4
cwd ;dx:ax = 4
mov bx, 3
imul bx ;ax = 4*3, dx отбрасываем
sub ax, 38 ;ax = 4*3-38
neg ax ;ax = 38-4*3
cwd ;dx:ax = 38-4*3
mov bx, 3
idiv bx ;ax = (38-4*3)/3, dx отбрасываем
mov di, ax ;di = (38-4*3)/3
mov ax, 14 ;ax = 14
sub ax, 5 ;ax = 14-5
mov bx, 3
imul bx ;dx:ax = (14-5)*3
add ax, 36
adc dx, 0 ;dx:ax = 36+(14-5)*3
idiv di ;ax = (36+(14-5)*3)/((38-4*3)/3), dx отбрасываем
mov bx, 3
imul bx ;dx:ax = ((36+(14-5)*3)/((38-4*3)/3))*3
sub ax, 3 ;ax = ((36+(14-5)*3)/((38-4*3)/3))*3-4, dx отбрасываем
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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен