Перейти к содержимому


- - - - -

Вопрос по ассемблеру


  • Вы не можете ответить в тему
Сообщений в теме: 3

#1 Абалдуй

Абалдуй

    Новенький

  • Пользователи
  • 114 сообщений

Отправлено 15 октября 2010 - 07:19

Столкнулся с очень интересной ситуацией. Суть в следующем. Вот код на ассемблере:

     mov al,81h ; = +-129
     mov bl,80h ; = +-128
     cmp al,bl
     ja _ja    ; если al > bl... al и bl берутся как безнаковые  (1)
     jg _jg    ; если al > bl... al и bl берутся как ЗНАКОВЫЕ!
     jmp quit
     
_ja:
     ; выполняется код здесь, так как 129 > 128
     jmp quit
_jg: 
     ; выполняется код здесь, так как OF = SF и ZF = 0, НО... -129 < -128 !!!!!
     
quit:

Так вот. В данном коде выполнится условный переход по метке _ja (так как 129 > 128 (по состояниям флагов тоже все верно: CF = 0, ZF = 0, SF = 0 OF = 0)).
Но, если закоментить строку (1), то переход выполнится и по метке _jg, хотя казалось бы, числа берутся как знаковые: -129 < -128, то есть перехода быть не должно, однако изходя из состояния флагов все верно: SF = OF и ZF = 0
Если просчитать все на листочке, то все вроде бы ок. Но где же здравый смысл ? Ведь -129 < -128
Мозги кипят уже. В чем дело то ? Или я что то упустил ?

#2 Mr.President

Mr.President

    banned

  • Пользователи
  • 7 084 сообщений
  • ГородБрянск

Отправлено 15 октября 2010 - 08:19

Чо та мне кажется ты форумом ошибся... :huh:
I'm back

#3 Абалдуй

Абалдуй

    Новенький

  • Пользователи
  • 114 сообщений

Отправлено 15 октября 2010 - 09:53

Потому что 81h в дополнительном коде равно 7Fh... То есть -127, а -127 > -128.

Рассуждения в первом посте ошибочны :D

Сообщение отредактировал Абалдуй: 15 октября 2010 - 09:54


#4 glonar

glonar

    Участник

  • Пользователи
  • 140 сообщений

Отправлено 16 ноября 2010 - 09:22

Спроси что-нибудь полегче, например, из C++. :rolleyes:





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей