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
4546
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 ] 

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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