2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 imul (ошибка в программе) [asm]
Сообщение23.11.2011, 14:43 


23/11/11
6
В общем есть программа(см оффтоп), в одном ее месте происходит что-то странное
Сама программа выполняет целочисленное деление с остатком без всяких команд деления типа 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

 Профиль  
                  
 
 Re: Ассемблер
Сообщение23.11.2011, 17:42 
Заслуженный участник


26/07/09
1559
Алматы
Скорее всего проблема в инструкции imul (результат сохраняется в паре регистров dx:ax, ведь произведение может быть гораздо больше множителей).

 Профиль  
                  
 
 Re: Ассемблер
Сообщение23.11.2011, 18:35 


23/11/11
6
В общем, мои мысли. В регисте "1" выглядит как "0000 0000 0000 0001"; в тоже время "-1" в доп.коде выглядит как "1111 1111 1111 1111". А т к в моей программе после IMUL: DX=-1 и AX=-1, то это значит что оба регистра выглядят как сплошные нули. Вот, странно оно умножается

 Профиль  
                  
 
 Re: Ассемблер
Сообщение23.11.2011, 18:54 
Заслуженный участник


04/05/09
4596
Lintu в сообщении #507040 писал(а):
В общем, мои мысли. В регисте "1" выглядит как "0000 0000 0000 0001"; в тоже время "-1" в доп.коде выглядит как "1111 1111 1111 1111". А т к в моей программе после IMUL: DX=-1 и AX=-1, то это значит что оба регистра выглядят как сплошные нули. Вот, странно оно умножается
imul - умножение со знаком.
DX:AX=-1:-1 это 32-х битное представление числа -1.
Есть и беззнаковое умножение: mul.

 Профиль  
                  
 
 Re: Ассемблер
Сообщение23.11.2011, 19:12 


23/11/11
6
Спасибо, все поняла!

 Профиль  
                  
 
 Re: Ассемблер
Сообщение23.11.2011, 19:16 
Заслуженный участник


26/07/09
1559
Алматы
2Lintu
Ой, я вас оказывается в начале совсем неправильно понял. Зато теперь меня смущает, что вы умножаете ноль на -1, а пишите, что 1 на -1 (в любом случае вы делаете mov ax, cx, а в cx лежит ноль.) Запутался я... :)

 Профиль  
                  
 
 Re: Ассемблер
Сообщение25.11.2011, 00:43 


23/11/11
6
Circiter в сообщении #507056 писал(а):
2Lintu
Ой, я вас оказывается в начале совсем неправильно понял. Зато теперь меня смущает, что вы умножаете ноль на -1, а пишите, что 1 на -1 (в любом случае вы делаете mov ax, cx, а в cx лежит ноль.) Запутался я... :)

Вообще в cx лежит не обязательно ноль, просто я взяла случай когда там 1(т е целая часть от деления 1)
Мне надо было понять как работает imul, и теперь я поняла что эта команда записывает ответ именно в удвоенном виде

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Alex-Yu


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group