У меня есть ошибка в одном из моих циклов, и я не могу это исправить. Это часть моего задания для школы. У меня есть массив с 20 элементами, и мне нужно умножить каждый элемент на 2, используя сдвиг бит. Это вроде работает, но каждый раз, когда у меня есть перенос, он добавляет 2 к предыдущему элементу массива, а не к одному. Я не могу правильно переносить перенос через массив. Это мой первый семестр со сборкой, поэтому я ценю вашу помощь. Кроме того, пожалуйста, держите его простым, если можете. Спасибо.Ошибка умножения массива языка сборки с использованием сдвига бит
Это то, что я хочу: 0000000009 ==> 0000000018 0000000099 ==> 0000000198
Это то, что я получаю. 0000000009 ==> 0000000028 0000000099 ==> 00000002108
Вот код.
ARR1 \t DB 20 DUP (0)
MULTIPLYING PROC
\t MOV AX, 0
\t MOV CX, 19
\t .WHILE CX != 0
\t \t \t \t MOV DI, CX
\t \t \t \t MOV AL, [DIGIT_ARR1+DI]
\t \t \t \t ;MOV BL, 2
\t \t \t \t ;MUL BL
\t \t \t \t SHL AX, 1
\t \t \t \t .IF AX > 9 \t \t ; IF THE NEW DIGIT IS LARGER THAN 9
\t \t \t \t \t SUB AX, 10
\t \t \t \t \t MOV AH, 0
\t \t \t \t \t MOV [DIGIT_ARR1+DI], AL
\t \t \t \t \t DEC DI
\t \t \t \t \t ADD [DIGIT_ARR1+DI], 1
\t \t \t \t .ELSEIF
\t \t \t \t \t MOV [DIGIT_ARR1+DI], AL \t ; IF IT IS LESS THAN 9, THEN JUST INSERT IT BACK INTO THE ARRAY
\t \t \t \t .ENDIF
\t \t DEC CX
\t .ENDW \t
\t RET
MULTIPLYING ENDP
Пожалуйста, вы можете указать процессор или набор инструкций. Сборка использует двоичные регистры, и похоже, что ваш код манипулирует каким-то типом массива denary. – Phil
А я вижу, вы используете массив адресов для представления каждой цифры. – Phil
Да, я забыл сказать, что мне нужно иметь одну цифру за раз, потому что программа работает с BCD. Я использую набор команд 8085 16 бит. – Jake