Язык ассемблера: разница между ja и jg? - PullRequest
2 голосов
/ 22 сентября 2011

У меня проблемы с пониманием разницы между ja и jg для языка ассемблера. У меня есть раздел кода:

cmp  dh, dl
j--  hit

и меня спрашивают, какой условный переход к удару (который заменяет j-- удар) будет выполнен с шестнадцатеричным значением DX = 0680.

Это сделало бы dl = 06 и dh = 80, поэтому при сравнении 80> 06. Я знаю, что jg подходит для этого, поскольку мы можем напрямую сравнивать результаты, но как мне подходить к решению, если подходит ja (или в этом случае не подходит) этот код?

Ответы [ 2 ]

8 голосов
/ 22 сентября 2011

Разница между ja и jg заключается в том, что сравнение является беззнаковым для ja и подписанным для jg (рассматривая регистры как целые числа со знаком и без знака).гарантированно будет положительным (т. е. бит знака равен 0), тогда все будет в порядке.В противном случае вы должны быть осторожны.

Вы действительно не можете интуитивно понять, основываясь на самой инструкции сравнения, если применимо ja.Вы должны посмотреть на контекст и решить, будет ли знак проблемой.

7 голосов
/ 22 сентября 2011
  1. Если dx равно 0x0680, то dh равно 0x06, а dl равно 0x80.
  2. 0x80 интерпретируется как 128 в режиме без знака и -128 в режиме со знаком.
  3. Таким образом, вы должны использовать jg, так как 6> -128, но 6 <128. <code>jg делает сравнение со знаком;ja делает сравнение без знака.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...