Сборка x86: jle прыгает, несмотря на то, что число больше [дубликат]

Angular1

Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises.

Здесь it говорит,

Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.

Вы можете найти приятное объяснение здесь .

Пример, найденный в docs , упомянутом ниже.

  promiseB = promiseA.then(
    function onSuccess(result) {
      return result + 1;
    }
    ,function onError(err) {
      //Handle error
    }
  );

 // promiseB will be resolved immediately after promiseA is resolved 
 // and its value will be the result of promiseA incremented by 1.

Angular2 and Later

In Angular2, посмотрите на следующий пример, но его рекомендовал использовать Observables с Angular2.

 search(term: string) {
     return this.http
  .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`)
  .map((response) => response.json())
  .toPromise();

}

Вы можете использовать это таким образом,

search() {
    this.searchService.search(this.searchField.value)
      .then((result) => {
    this.result = result.artists.items;
  })
  .catch((error) => console.error(error));
}

См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.

Кроме того, здесь представлены обещания spec определите здесь.

3
задан Roy Li 4 December 2014 в 02:47
поделиться

2 ответа

Вы не можете напрямую сравнивать два числа, которые имеют разные знаки. На самом деле большинство языков программирования имеют этот поток. C и C ++ специально упоминают, что в их документации и в большинстве случаев генерирует предупреждение, когда вы используете подписанное и целое число без знака в одном выражении, которое может привести к неизвестному знаку.

Единственный способ чтобы проверить, является ли подписанное число отрицательным, если это так, то вы знаете, что оно меньше. Затем вы можете сравнить два числа как целые числа без знака.

; is eax < ebx (eax signed, ebx unsigned)

cmp eax, $0
jl less

cmp eax, ebx
jc less

Боковое примечание: очевидно, можно сравнить два числа, подписанные, если их размер меньше максимального размера, поддерживаемого процессором. В этом случае вы соответствующим образом расширяете бит подписанного и неподписанного, тогда вы можете сравнить, как если бы оба значения были подписаны.

Предполагая, что вы хотите сравнить два байта al и bl, тогда вы могли бы что-то вроде этого :

movsx ax, al
xor bh, bh    ; or movzx bx, bl
cmp ax, bx
jl less

(Заметьте, я не гарантирую, что jl верен, это может быть jle или jnl ...)

2
ответ дан Alexis Wilke 5 September 2018 в 09:27
поделиться

Вы , вероятно, , используя один из неподписанных вариантов, таких как:

cmp  eax, ebx
jb   lesser

Существуют эквиваленты для проверки подписанных чисел друг против друга, например:

cmp  eax, ebx
jl   lesser

Эта ссылка дает хороший пробег по вариациям прыжка, включая их подписанность и флаги, которые они проверяют, частично скопированные здесь для самоконденсации:

Instruction  Jump if ...           Signed?   Flags
-----------  -----------           --------  -----
JO           overflow                        OF=1
JNO          not overflow                    OF=0
JS           sign                            SF=1
JNS          not sign                        SF=0
JE/JZ        equal
             zero                            ZF=1
JNE/JNZ      not-equal
             not-zero                        ZF=0
JB/JNAE/JC   below
             not-above-or-equal
             carry                 unsigned  CF=1
JNB/JAE/JNC  not-below
             above-or-equal
             no-carry              unsigned  CF=0
JBE/JNA      below-or-equal
             not-above             unsigned  CF=1 or ZF=1
JA/JNBE      above
             not-below-or-equal    unsigned  CF=0 and ZF=0
JL/JNGE      less
             not-greater-or-equal  signed    SF<>OF
JGE/JNL      greater-or-equal
             not-less              signed    SF=OF
JLE/JNG      less-or-equal
             not-greater           signed    ZF=1 or SF<>OF
JG/JNLE      greater
             not-less-or-equal     signed    ZF=0 and SF=OF
JP/JPE       parity
             parity-even                     PF=1
JNP/JPO      not-parity
             parity-odd                      PF=0
JCXZ/JECXZ   CX register is zero
             ECX register is zero
9
ответ дан paxdiablo 5 September 2018 в 09:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: