cmp ax bx



Автор Pohui задал вопрос в разделе Другие языки и технологии

Деление отрицательного числа. Ассемблер и получил лучший ответ

Ответ от Миоко Таканава[гуру]
Денис Евдоченко, не обижайтесь, но здесь нужно просто правильно применить знаковое деление, а не выдумывать костыли.
Андрей Жиркевич, специально для подобных случаев чуть ли не целую статью сочинила с примерами , как правильно использовать целочисленное знаковое деление.
В вашем случае вместо
mov bx,2
xor dx,dx
div bx
нужно писать
mov bx,2
cwd ; расширение делимого со знаком ax -> dx:ax
idiv bx; знаковое деление
Ну, и ещё кое-что по-мелочи можно оптимизировать и нужно исправить в программе:
.model small
.stack 100h
.data
b dw 4
c dw 8
d db 2
.code
start:
mov ax,@data
mov ds,ax
mov ax,b
sub ax,c
add ax,2
sar ax,1; сдвиг вправо на 1 разряд с учётом знака (эквивалентно делению на 2)
mov bx,ax
mov ax,c
mov cx,6
imul cx; знаковое умножение на случай, если с < 0
add bx,ax
test bx,bx; установка флагов, в том числе флага знака SF
jns f0
neg bx
mov al,'-'; Выводится содержимое al, a не dl
int 29h
f0:
mov ax,bx
xor cx,cx
mov bx,10
f1: xor dx,dx
div bx
push dx
inc cx
or ax,ax; установка флагов по значению ax, в том числе флаг нуля ZF
jne f1
f2: pop ax
add al,'0'int 29h
loop f2
xor ah,ah
int 16h
mov ax,4c00h
int 21h
end start
P.S. Имейте в виду, что значения переменных, результат и все промежуточные результаты должны находиться в пределах 15 разрядов (-32768 ..32767).

Ответ от Денис Евдоченко[гуру]
1. делить через fpu
2.перед делением test на самый старший бит, если 1, то куда нить добавить единицу и neg на число, если выходит в сумме 1, то отриц. число neg, иначе положит.

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с ответами на Ваш вопрос: Деление отрицательного числа. Ассемблер
спросили в Цикл
С++, Чем отличаеться цикл for, от while?
По сути своей мало чем отличаются, нюансами - сильно отличаются.
while (условное выражение)подробнее...
спросили в Ассемблер
Ассемблер сдвиги. Как умножить любое число на 13 с помощью сдвигов в ассемблере
13 = (2 + 1) * 4 + 1 - меньше сдвигов (3 против 5), хотя это актуально только для процессоров,
подробнее...

Сортировка массива на ассемблере
>Сам пробовал, не получается.
Не верю. Пустой цикл попыткой не считается.

data
подробнее...
спросили в K Line
Помогите, пожалуйста!!!
Пусть M и N — середины оснований BC и AD равнобедренной трапеции ABCD с перпендикулярными
подробнее...
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*