Ошибка при вычитании в ассемблере

я попытался написать код для вычитания(12-23)в ассемблере ,но видимо чего то не хватает и результат 245.Подскажите пожалуйста чего не хватает ?Заранее благодарен. ПС.Я новичок в ассемблере .Прошу прошения если глупый вопрос.Но очень хочется разобраться.

      list p=16f877a
      #include <p16f877a.inc>
tempa EQU h'020'
tempb EQU h'021'

      org 0x00
      goto begin
      org 0x100

begin
      clrw
      clrf tempa
      clrf tempb
      movlw d'12'
      movwf tempa
      movlw d'23'
      movwf tempb
      subwf tempa,1
      nop
      end

Ответы (1 шт):

Автор решения: Dmitriy Vizir
  • Все ты делаешь так.

  • Все ты делаешь так. Просто 12 - 23 = -11 Отрицательное число.

  • А как представляются отрицательные числа в памяти современных процов ? В виде дополнения до двух, а такое представление очень удобно
    потому что одна и та-же операция сложения или вычитания годится как
    для знаковых, так и для беззнаковых чисел. От этого процессор не
    знает знаковое число или беззнаковое. Различать их должен
    программист. -11 знаковое в двоичном виде в байте будет хранится
    как 11110101 245 беззнаковое в двоичном виде в байте будет
    хранится тоже как 11110101 Ты должен их различать и никто иной.

    Т.е. смотришь на 11110101 двоичное или что тоже самое F5 шестнавдцатеричное и говоришь себе - я понимаю это число как знаковое и тогда оно -11 или я понимаю это число как беззнаковое и тогда оно 245 А процик оба варианта не различает, он с обоими вариантами работает одними и теми-же операциями ADDWF SUBWF. А отладчик мысли твои читать не умеет и показывает это число как 245. Но для тебя, если ты в своей проге понимаешь это число как знаковое оно -11 и ничто иное.

→ Ссылка