Как работает флаг переноса на 68000? - PullRequest
1 голос
/ 02 июня 2011

Так что я немного озадачен тем, как работает флаг переноса, особенно на процессоре 68000 (но это может не иметь значения).

Мой главный вопрос заключается в следующем:

move.b (a0),d0
moveq #7,d1
cmp.b d1,d0
bcc.s DATAErr3

Очевидно, что байт в A0 копируется в D0, а затем D0 сравнивается с 7. Но затем, существует ветвь для DATAErr3, если установлен флаг переноса («bcc»).В этой операции, какие значения D0 приведут к установке флага переноса?Какие значения приведут к тому, что он не будет установлен?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 02 июня 2011

ветви BCC, если d0 >= d1, в без знака сравнения. В этом случае инструкция BCC будет выполняться, если d0 больше или равно 7 или отрицательно.

http://www.easy68k.com/paulrsm/doc/trick68k.htm

2 голосов
/ 10 ноября 2014

Как вы, наверное, знаете, cmp на самом деле является вычитанием, но без обновления пункта назначения. Для синтаксиса ассемблера 68000 назначение всегда справа. Таким образом, команда cmp.b d1,d0 вычитает байт, сохраненный в d1, из байта, сохраненного в d0, и затем отбрасывает результат, но обновляет флаги в соответствии с этой операцией. Флаг переноса устанавливается на основе значений без знака в регистрах.
Поэтому, если d0.b содержит что-либо от 0 до 6, вычитание 7 из 0..6 сгенерирует заем и установит флаг переноса. bcc.s будет не ветвь. Если d0.b равно от 7 до 255, перенос будет очищен, а bcc.s ответвляется.

0 голосов
/ 14 января 2018

Другой способ взглянуть на bcc и bcs:

  • blo = bcs
  • bhs = bcc

т.е. bcc эквивалентно условию без знака "выше или одинаково" и blo условию "без знака" ниже "

...