У меня есть несколько вопросов по этому коду:
; Convert an 16 bit binary value to BCD
;
; This function converts a 16 bit binary value into a 24 bit BCD. It
; works by transferring one bit a time from the source and adding it
; into a BCD value that is being doubled on each iteration. As all the
; arithmetic is being done in BCD the result is a binary to decimal
; conversion. All conversions take 915 clock cycles.
;
; See BINBCD8 for more details of its operation.
;
; Andrew Jacobs, 28-Feb-2004
.ORG $0200
BINBCD16: SED ; Switch to decimal mode
LDA #0 ; Ensure the result is clear
STA BCD+0
STA BCD+1
STA BCD+2
LDX #16 ; The number of source bits
CNVBIT: ASL BIN+0 ; Shift out one bit
ROL BIN+1
LDA BCD+0 ; And add into result
ADC BCD+0
STA BCD+0
LDA BCD+1 ; propagating any carry
ADC BCD+1
STA BCD+1
LDA BCD+2 ; ... thru whole result
ADC BCD+2
STA BCD+2
DEX ; And repeat for next bit
BNE CNVBIT
CLD ; Back to binary
BRK ; All Done.
; A test value to be converted
.ORG $0300
BIN .DW 12345
BCD .DS 3
с этого сайта.
Я не понимаю, что именно делает эта строка:
ROL BIN+1
Выполняется ли сдвиг вправо на втором байте BIN? Если да, то что именно находится в этом байте?
Также можно ли написать что-нибудь подобное для x86? Можно ли использовать BCD, чтобы распечатать число в десятичном формате с помощью x86 каким-то элегантным способом? Или лучше придерживаться деления на 10? Я кое-что знаю об инструкциях AAA, AAM, но не знаю, действительно ли они полезны.
ROL
= повернуть влево. Так что это не сдвиг и не правильно: D Но да, это второй байт. _2 _ + _ 3_ вместе сдвигают 16-битное число вBIN
иBIN+1
.ROL
используется для преобразования старшего бита младшего байта в младший бит старшего байта. - person Jester   schedule 24.12.2020DAA
, а неAAA
инструкцию. Кроме того, файлы BCD устарели и недоступны в 64-битном режиме. - person Jester   schedule 24.12.2020div
. (Или эффективно использоватьimul
с мультипликативным обратным преобразованием, как в этом алгоритме преобразования целого числа в ASCII (сборка x86) - он даже сдвигает десятичные цифры ASCII в регистр; вы можете сделать это для упакованного или распакованного BCD без добавления'0'
. Деление на 10 до 6 десятичных цифр (особенно с использованием обратного умножения) будет быстрее на современных x86, чем порт Jester ваш код 6502. - person Peter Cordes   schedule 24.12.2020