Другие языки программирования и технологии

Деление отрицательного числа. Ассемблер

При делении отрицательного числа искажается ответ! Вот код программы: ;6*c+(b-c+2)/2=1251=4e3 582 masm .model small .stack 100h .data b dw 4 c dw 8 d db 2 .code start: mov ax,@data mov ds,ax mov ax,6 mov bx,c mul bx mov cx,ax mov bx,b mov ax,c sub bx,ax add bx,2 mov ax,bx mov bx,2 xor dx,dx div bx add cx,ax xchg ax,cx cmp ax, 0 jg f0 mov bx, ax mov dl, '-' int 29h mov ax, bx neg ax f0: xor cx,cx mov bx,10 f1: xor dx,dx div bx push dx inc cx cmp ax,0 jne f1 f2: pop ax add al,'0' int 29h loop f2 mov ah,10h int 16h mov ax,4c00h int 21h end start При данных значениях : b dw 4 c dw 8 d db 2 в скобке получается отрицательное число, которое нужно разделить на два, а при делении ответ искажается. Не пойму что можно с этим сделать (пробывал и div и idiv - разницы нет). С положительными числами все работает! Если можно, свой код выкладывайте с комментариями! Заранее спасибо!
Денис Евдоченко, не обижайтесь, но здесь нужно просто правильно применить знаковое деление, а не выдумывать костыли.
Андрей Жиркевич, специально для подобных случаев чуть ли не целую статью сочинила с примерами смотреть здесь, как правильно использовать целочисленное знаковое деление.
В вашем случае вместо
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).
Магжан Мурат
Магжан Мурат
51 590
Лучший ответ
1. делить через fpu

2.перед делением test на самый старший бит, если 1, то куда нить добавить единицу и neg на число, если выходит в сумме 1, то отриц. число neg, иначе положит.