Вопрос 1: Зачем мне нужно DIV на # 0AH, чтобы получить BCD двоичного значения?
Чаще всего каждое целое значение в компьютере (и микроконтроллере) это компьютер) хранится в двоичном виде в наши дни. Так что тут делать особо нечего. Если вы хотите BCD (двоично-десятичный код), вам понадобятся сотни, десятки и единицы, разделенные по 4 бита каждая. Для этого вам нужно разделить на 10 (и сохранить остаток), и это может быть закодировано как #0AH
. Тем не менее, я бы не писал это, а написал бы #10
, который показывает намного более ясный смысл.
Предположим, что число для преобразования находится в аккумуляторе A
, и вы хотите получить результат в регистровой паре R0 (MSByte) и R1 (LSByte). Вам нужно более одного регистра, потому что вы получите 3 цифры, которые будут иметь ширину 12 бит.
DIV
разделит A
на B
и даст целое отношение в A
и остаток в B
.
MOV B,#10
DIV AB ; floor(number / 10) in A, 1s in B
MOV R1,B ; 1s are now in R1 (bits 3 to 0)
MOV B,#10
DIV AB ; floor(number / 100) in A, 10s in B
MOV R0,A ; 100s are now in R0 (bits 3 to 0)
MOV A,B ; 10s are now in ACC (bits 3 to 0)
SWAP A ; 10s are now in bits 7 to 4 in ACC
ORL A,R1
MOV R1,A ; 10s and 1s are now in R1
Вопрос 2. Нужно ли мне передавать [answerer: negate] второй операнд по CPL и +1 или можно просто использовать SUBB?
Нет, вы просто используете SUBB
. Перед первым SUBB
вы сбросите флаг переноса.
Предположим, что первый операнд (для вычитания из «minuend») находится в регистровой паре R0 (MSByte) и R1 (LSByte), и второй операнд (для вычитания «вычитаемое») находится в регистровой паре R2 (MSByte) и R3 (LSByte). Результат («разница») должен go в регистровой паре R4 (MSByte) и R5 (LSByte).
CLR C
MOV A,R1
SUBB A,R3
MOV R5,A
MOV A,R0
SUBB A,R2 ; borrow bit from LSByte subtraction is taken into account
MOV R4,A
Конечное примечание: Пожалуйста, используйте симулятор попробовать код, если вы хотите увидеть детали, не описанные здесь.