Два вопроса почти одинаковы.Вы пытаетесь представить число, содержащее 2 цифры, с 1 байтом ASCII.Вам нужно зациклить ваш ввод И на вашем выходе.Позволь мне объяснить.Заранее извиняюсь, что пример 64-битный ... вы не опубликовали свой полный код, поэтому я просто побежал с тем, что я знал лучше всего, чтобы написать этот ответ.
По сути, вы делаете это: (53 - 48) + (54 - 48)
.Это дает нам значение 11. Пока все хорошо.Что такое значение ASCII для представления 11 как одного символа ?
Нет one .Что вам нужно, это напечатать символ '1'
, дважды (чтобы сформировать строку "11"
).
Затем вам нужно преобразовать число, которое имеет более 1 цифры, встрока.Возможно, было бы достаточно что-то вроде itoa
функции в стандартной библиотеке C.
По сути, вам нужно перебрать число и преобразовать каждую цифру в символ, чтобы сформировать строку, которую вы можетеРаспечатать.Вы можете сделать это, разделив число на 10 на каждой итерации и проверив остаток. Вот пример, работающий на IDEOne
Ядром itoa
примера является цикл деления:
.divloop:
xor rdx,rdx ; Zero out rdx (where our remainder goes after idiv)
idiv rcx ; divide rax (the number) by 10 (the remainder is placed in rdx)
add rdx,0x30 ; add 0x30 to the remainder so we get the correct ASCII value
dec rdi ; move the pointer backwards in the buffer
mov byte [rdi],dl ; move the character into the buffer
inc dword [rbp-4] ; increase the length
cmp rax,0 ; was the quotient zero?
jnz .divloop ; no it wasn't, keep looping
Давайте запустим число 59 из вашего второго примерашаг за шагом:
Текущий буфер:
[0][0][0][0][0][0][0][0][0][0]
Первая итерация:
59 / 10 = 5 remainder 9
9 + 48 = 57 (the ASCII value of '9')
[0][0][0][0][0][0][0][0][0][57]
^ place the ASCII value in the buffer, decrease the pointer and update the number to be the quotient from the idiv instruction
Итак, если мы распечатаем это сейчас, мы получим число 9Коэффициент не был равен нулю, поэтому мы снова зациклимся:
5 / 10 = 0 remainder 5
5 + 48 = 53 (the ASCII value of '5')
[0][0][0][0][0][0][0][0][53][57]
^ place the ASCII value in the buffer, decrease the pointer and update the number to be the quotient from the idiv instruction
Коэффициент равен нулю на этой последней итерации, поэтому мы не зацикливаемся и не завершаем функцию.
Эти два байта в буфере теперь 53
и 57
, которые являются значениями ASCII символов 5
и 9
соответственно.Если бы вы должны были напечатать этот буфер на свой стандартный вывод, он бы вывел строку "59"
(эта функция примера также возвращает длину полученной строки, чтобы ее можно было правильно распечатать).
Существует аналогичноепроблема с вашим вкладом.Вы передаете строки «49» и «59» и читаете только самый первый символ.Вам нужно перебрать эту строку и преобразовать ее в целое число.Это должно быть довольно просто, поэтому я оставлю это как упражнение для вас.
Причина, по которой второй пример «работает» (он печатает число, которое вы ожидаете), связана с ошибкой выше.Вы складываете только 4 и 5 вместе, в результате получается 9 - число, состоящее из одной цифры.
Надеюсь, это поможет.