Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с imul, три числа неправильно перемножаются 
V
    Опции темы
Dufeij
Дата 17.7.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.7.2010
Где: Донецк (Украина)

Репутация: нет
Всего: нет



Только начал учить асм, взялся решить простую задачку и возникли проблемы. (Пользуюсь TASM`ом) В результате вычисления формулы должно получится -1 но получается 65535. Чтобы найти причину, после каждого действия результат заносил в y и в турбо дебаггере смотрел что получается. Оказалось что неправильно перемножаются 7*b*c, 7*b=21 все нормально, но 7*b*c = 65431. Почему так? 

a=15
b=3
c=-5

Код


Turbo Assembler     Version 2.5        17/07/10 11:55:07        Page 1
labor1.ASM



      1                     ;Условие
      2                     ;       2c^2+7*b*c
      3                     ; X = -----------
      4                     ;         c^2+2*a
      5                     ;
      6                     ; a=15 b=3    c=-5
      7    0000                 sseg   segment 'STACK'
      8    0000  40*(??)                 db         64    dup(?)
      9    0040                 sseg   ends
     10    0000                 data    segment
     11    0000  000F             a         dw        15
     12    0002  0003             b         dw        3
     13    0004  FFFB             c         dw        -5
     14    0006  ????             x         dw        ?
     15    0008  ????             y         dw        ?
     16    000A                 data    ends
     17    0000                 code    SEGMENT
     18                     assume ss:sseg,ds:data,cs:code
     19    0000                 start   proc    far
     20                     ;--------------Возврат в dos
     21    0000  1E                 push    ds
     22    0001  B8 0000                 mov     ax,0
     23    0004  50                 push    ax
     24                     ;--Занесение в регистр ds адреса сегмента данных
     25    0005  B8 0000s                 mov     ax,data
     26    0008  8E D8                 mov     ds,ax
     27                     ;--------------Начало программы
     28    000A  A1 0004r             mov  ax,c
     29    000D  F7 2E 0004r         imul c          ;c^2
     30    0011  8B D8             mov  bx,ax 
     31    0013  D1 E0             shl  ax,1      ;2*c^2 
     32    0015  8B C8             mov  cx,ax
     33    0017  89 0E 0008r         mov  y,cx
     34
     35    001B  B8 0007             mov  ax,7
     36    001E  F7 2E 0002r         imul b         ;7*b
     37    0022  F7 2E 0004r         imul c         ;7*b*c
     38    0026  A3 0008r             mov y,ax
     39
     40    0029  03 C8             add  cx,ax  ;2*c^2+7*b*c
     41    002B  89 0E 0008r         mov  y,cx
     42
     43    002F  A1 0000r             mov  ax,a
     44    0032  D1 E0             shl  ax,1     ;2*a
     45    0034  A3 0008r             mov  y,ax
     46
     47    0037  03 D8             add  bx,ax  ; c^2+2*a
     48    0039  89 1E 0008r         mov  y,bx    
     49
     50    003D  8B C1             mov  ax,cx
     51    003F  99             cwd                           
     52    0040  F7 FB             idiv bx         ; 2*c^2+7*b*c                                                 
     53    0042  A3 0006r             mov x,ax     ;--------------------
     54                                                                       ; c^2+2*a
     55                     ;-------------------------------
     56    0045  CB             st_ret: ret
     57    0046                 start   endp
 
Turbo Assembler     Version 2.5        17/07/10 11:55:07        Page 2
labor1.ASM



     58    0046                 code    ends
     59                         end     start




Это сообщение отредактировал(а) Dufeij - 17.7.2010, 12:31
PM MAIL Skype   Вверх
JAPH
Дата 17.7.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Как определили, что 65535, а не -1?
Для 16-битных чисел двоичное представление как 65535, так и -1 одинаково: 0FFFFh. И проводить различие между тем, знаковое это число (-1) или беззнаковое (65535) - задача программиста, а не процессора.


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Dufeij
Дата 17.7.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.7.2010
Где: Донецк (Украина)

Репутация: нет
Всего: нет



Немного разобрался, спасибо. А после уножения 7*b*c где хранится минус?

В результате 65431 -> 2 c.c. 111111111001011 -> 1101000 + 1 -> 10 c.c. 105  Где минус?
PM MAIL Skype   Вверх
JAPH
Дата 17.7.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



В знаковых числах старший бит определяет знак: 0 = "+", 1 = "-".


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
izl3sa
Дата 19.7.2010, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.6.2010

Репутация: нет
Всего: нет



>> В знаковых числах старший бит определяет знак: 0 = "+", 1 = "-".

а то что число signed определяется операциями, которые над ним выполняют. Те в общем случае без контекста нельзя сказать какое число - знаковое или нет. Да и ещё, в x86 отрицательные числа получаются дополнением до двух -eax = (neg eax) + 1, те 0x00000001 -> 0xFFFFFFFE + 1 = 0xFFFFFFFF
Немного дополнил теорию =) впрочем все это есть в учебниках по асму, или вы тоже пропускаете неинтересную с виду математику при первом прочтении? =))
PM MAIL   Вверх
Dufeij
Дата 20.7.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.7.2010
Где: Донецк (Украина)

Репутация: нет
Всего: нет



Каюсь. Пропускаю.  Сам же от этого и страдаю.  smile 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.