Как преобразовать число ASCII в двоичный файл в MC68K

Я должен написать программу, которая требует 20 введенных пользователем чисел от 0 до 100, чтобы найти среднее число и классифицировать их как ошибочные или пропущенные, но это сохраняет ввод как ascii в памяти, и я должен изменить его с ascii на двоичный. Я знаю, что числа ASCII 30-39 в шестнадцатеричном формате, но я не уверен, как реализовать это в MC68K, например, если я введу 93 как число, то оно будет сохранено как 3933, но как мне преобразовать его в двоичный файл?

2 ответа

  clear number
loop:
  get highest digit character not dealt with yet
  compare digit character to '0' ; that's character 0, not value 0
  blo done
  compare digit character to '9'
  bhi done
  multiply number by 0x0a ; 10 in decimal
  subtract 0x30 from the character
  add to number
  jmp loop
cone:
  ...

Вот как бы я это сделал:

str_to_int:
    ; Converts a decimal signed 0-terminated string in a0 into an integer in d0.
    ; Stops on the first non-decimal character. Does not handle overflow.
    ; Trashes other registers with glee.
    moveq #0, d3
.signed:
    cmpi.b #'-',(a0)     ; Check for leading '-'.
    bne.s  .convert
    bchg   #0,d3
    addq.l #1,a0
    bra.s  .signed
.convert:
    moveq.l #0,d0
    moveq.l #0,d1
.digit:
    move.v (a0)+,d1
    beq.s  .done
    subi.b #'0',d1       ; Convert to integer.
    bmi.s  .done         ; If < 0, digit wasn't valid.
    cmpi.b #'9'-'0',d1
    bgt.s  .done         ; If larger than 9, done.
    muls.l #10,d0
    add.l  d1,d0
    bra.s  .digit
.done:
    tst.b  d3
    bne.s  .signed
    rts
.signed:
    neg.l  d0
    rts

Примечание: выше приведен непроверенный ассемблерный код для процессора, с которым я не сталкивался... довольно давно. Надеюсь, это может быть по крайней мере вдохновляющим. Раньше, конечно, никто не осмелился бы использовать muls здесь, но это учебно. Простите за каламбур.

Другие вопросы по тегам