В общем есть программа(см оффтоп), в одном ее месте происходит что-то странное
Сама программа выполняет целочисленное деление с остатком без всяких команд деления типа div, idiv, mod и т д. Т е используется вычитание вместо деления.
Так вот, после метки L2, вот в этом куске какие то чудеса, а именно в dx попадает -1:
Код:
OUTINT dx ;dx=0
OUTINT di ;di=-1
MOV AX,CX ;в ax целая часть без учета знака, ax умножится на знак
IMUL DI ;di умножится на ax -> ax, это конечный результат целой части
OUTINT AX ;ax=-1(все ок)
OUTINT DX ;dx=-1(не oк)
OUTINT DI ;di=-1(ок)
Ясное дело я чего то еще не знаю, вот и удивляюсь. Т к по идее (dx,ax):=AX*DI=-1*1=-1, -1 должно попасть только в регистр ax
PS:программа не отлажена и скорее всего в ней есть левые ошибки, но меня сейчас интересует только то, что спросила
(Оффтоп)
Код:
%TITLE "Ваш комментарий программы"
INCLUDE IO.ASM
MODEL small
ST1 SEGMENT ;Описали сегмент стека;
DB 128 DUP(?)
ST1 ENDS
DATA SEGMENT
A DB 'Целая часть:','$'
B DB 'Остаток:','$'
C DB 'Деление на ноль!','$'
DATA ENDS
CODE SEGMENT ;открыли сегмент кода;
ASSUME SS:ST1,DS:DATA,CS:CODE ;связали регистровые сегменты с сегментами;
Start:
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
;========== Ниже пишите Ваш код ==============================
MOV DI,1 ;переменная знака
MOV CX,0 ;целая часть
inint DX ;ввод делимого
inint BX ;ввод делителя
CMP BX,0 ;оцениваем делитель
JG L3 ;делитель положительный, переходим к оценке делимого
JE ER ;делитель ноль - ошибка
NOT BX ;берем bx по модулю
ADD BX,1
NOT DI ;учитываем минус делителя
ADD DI,1
L3: CMP DX,0 ;оцениваем делимое
JG L5 ;делимое положительное, переходим к делению
JE L4 ;делимое ноль, переходим к быстрому выводу, где целая часть 0, остаток - bx
NOT DX ;берем dx по модулю
ADD DX,1
NOT DI ;учитываем минус делимого
ADD DI,1
L5: CMP dx, bx ;проверяем ax<bx но они не равны нулю
JB L4 ;переходим к быстрому выводу, где целая часть 0, а остаток - bx
L1: CMP DX,BX ;отнимаем-отнимаем-...
JB L2
SUB DX,BX ;отняли..
INC CX ;..к целой части 1 прибавили
JMP L1 ;и опять сначала
ER: MOV AH,9H
LEA DX,C
INT 21H
JMP THEEND
L4: MOV AH,9H ;случай когда целая часть ноль, а остаток - это bx
LEA DX,A
INT 21H
OUTINT CX
NEWLINE
MOV AH,9H
LEA DX,B
INT 21H
OUTINT BX
JMP THEEND
L2:
outint dx
outint di
MOV AX,CX ;в ax целая часть без учета знака, ax умножится на знак
IMUL DI ;di умножится на ax -> ax, это конечный результат целой части
OUTINT AX
OUTINT DX
OUTINT DI
MOV DI,AX
MOV BX,DX
MOV AH,9H
LEA DX,A
INT 21H
OUTINT DI ;DI-целая часть
NEWLINE
MOV AH,9H
LEA DX,B
INT 21H
OUTINT BX ;BX-остаток
JMP THEEND
THEEND:
;========== Заканчивайте писать Ваш код======================
pop ax
pop ds
Exit: finish
ENDS
END Start