Hadoop - главный узел дисковой части кластера хранения внезапно. Как мне это убрать?

Вам нужно написать двоичную процедуру преобразования в десятичный код, а затем использовать десятичные цифры для создания «цифровых символов» для печати. ​​

Вы должны предположить, что что-то где-то будет печатать символ на ваше устройство вывода по выбору. Вызовите эту подпрограмму «print_character»; предполагает, что он принимает код символа в EAX и сохраняет все регистры .. (Если у вас нет такой подпрограммы, у вас есть дополнительная проблема, которая должна быть основой другого вопроса).

Если у вас есть двоичный код для цифры (например, значение от 0 до 9) в регистре (скажем, EAX), вы можете преобразовать это значение в символ для цифры, добавив код ASCII для символа «нуль», чтобы регистр. Это также просто:

       add     eax, 0x30    ; convert digit in EAX to corresponding character digit

Затем вы можете вызвать print_character для печати символьного кода.

Чтобы вывести произвольное значение, вам нужно выбрать цифры и распечатать их .

Выбор цифр принципиально требует работы с полномочиями в десять. Проще всего работать с одной мощностью десять, например, самой 10. Представьте, что у нас есть подпрограмма «разделить на 10», которая взяла значение в EAX, и произвела коэффициент в EDX и остальную часть EAX. Я оставляю это как упражнение для вас, чтобы выяснить, как реализовать такую ​​процедуру.

Тогда простая процедура с правильной идеей состоит в том, чтобы произвести одну цифру для всех цифр, которые могут иметь значение. 32-битный регистр хранит значения до 4 миллиардов, поэтому вы можете напечатать 10 цифр. Итак:

         mov    eax, valuetoprint
         mov    ecx, 10        ;  digit count to produce
loop:    call   dividebyten
         add    eax, 0x30
         call   printcharacter
         mov    eax, edx
         dec    ecx
         jne    loop

Это работает ... но печатает цифры в обратном порядке. К сожалению! Ну, мы можем воспользоваться стеком pushdown для хранения произведенных цифр, а затем вывести их в обратном порядке:

         mov    eax, valuetoprint
         mov    ecx, 10        ;  digit count to generate
loop1:   call   dividebyten
         add    eax, 0x30
         push   eax
         mov    eax, edx
         dec    ecx
         jne    loop1
         mov    ecx, 10        ;  digit count to print
loop2:   pop    eax
         call   printcharacter
         dec    ecx
         jne    loop2

Слева в качестве упражнения для читателя: подавляйте ведущие нули. Кроме того, поскольку мы пишем цифры в памяти, вместо того, чтобы записывать их в стек, мы можем записать их в буфер, а затем распечатать содержимое буфера. Также оставлен в качестве упражнения для читателя.

0
задан sriteja 11 March 2019 в 13:58
поделиться