2013-02-19 3 views
0

Я работаю над программой на языке ассемблера, которая будет вычислять сумму цифр целого числа, которое будет введено клиентом. Номер всегда будет 10 цифр. Я очень новичок в собрании, и я понятия не имею, как действовать дальше. Вот то, что я написал до сих пор:Как добавить цифры числа в сборку x86

 SECTION .data 

msg1: db "Enter a number 10 digits long: " 
len1: equ $-msg1 

msg2: db "The sum of the digits is " 
len2: db $-msg2 


     SECTION .bss 

num: resb 10 
sum: resb 3 


     SECTION .text 
     global _start 

_start: nop 

start: 

     ;prompt for number 
     mov  eax, 4 
     mov  ebx, 1 
     mov  ecx, msg1 
     mov  edx, len1 
     int  080h 

     ;input number 
     mov  eax, 3 
     mov  ebx, 0 
     mov  ecx, num 
     mov  edx, 10 
     int  080h 

init: 
     mov  esi, num 
     mov  edi, sum 

add_digits: 

     ;loop 10 times 
     ;retrieve next digit 
     ;add '0' to convert to number 
     ;add to sum 

     ;subtract 0 to sum 


     ;print results 
     mov  eax, 4 
     mov  ebx, 1 
     mov  ecx, msg2 
     mov  edx, len2 
     int  080h 

     mov  eax, 4 
     mov  ebx, 1 
     mov  ecx, sum 
     mov  edx, 3 
     int  080h 

     ;exit 
exit: 
     mov  eax, 1 
     mov  ebx, 0 
     int  080h   

Мне просто нужно знать, как реализовать псевдокод в «add_digits». Кроме того, дайте мне знать, если я написал код из-за плохого/неправильного. Очень ценится.

+0

Домашнее задание, случайно? –

+0

У меня есть вариант этого как домашнее задание, но это основное ядро ​​того, что мне нужно сделать, и у меня есть идея, как его написать. –

+0

Самая левая цифра числа - это остаток от деления числа на 10. Фактор, с другой стороны, дает вам номер с самой правой цифрой, стертой. Повторяйте до тех пор, пока он не опустится до нуля. –

ответ

2

Прочитайте инструкцию diva AKA div, как она дает вам как частное, так и остальное. Затем подумайте о взаимосвязи между получением цифр числа и деления на 10.

0

1) поскольку sys_read всегда возвращает строку перевода - не будет возвращаться без нее - я бы выделил 11 байтов для буфера и поместил 11 в edx для sys_read. Возможно, вы захотите также сбросить буфер ...

2) вы хотите вычесть '0' для преобразования из символа в число и добавить '0' для преобразования из числа в символ. Ваши комментарии имеют обратную сторону.

3), так как мы знаем, согласно «спецификации», что сумма не будет превышать 90, который будет вписываться в байтах и ​​может быть представлена ​​в двух персонажах, да есть способ избежать div ...

; sum in al... 
aam ; split the byte in al into two digits in al and ah 
add ax, 3030h ; add '0' to both digits 
xchg al, ah ; swap 'em into right order 
mov [edi], ax ; store both characters in "[sum]" 
mov byte [edi + 2], 10 ; linefeed after printing it? 

(ПРЕДУПРЕЖДЕНИЕ непроверенный код!) Это красиво и коротко, но ограничено в диапазоне номеров, которые он преобразует - удобно для «временных» чисел. Я научился делать это с помощью div и/или научиться использовать функции библиотеки C, но если моя память встряхивается, это должно сделать это.

0

Если вы прочитали номер в памяти в виде двоичного кода, вам нужно будет снова извлечь цифры из числа, то есть вам нужно преобразовать из двоичного в десятичный. Для преобразования между числовыми системами необходимо разделить (в этом случае делить на 10) или использовать некоторые специальные алгоритмы. Есть double dabble для преобразования из двоичного в десятичное без деления, но, возможно, это медленнее, чем деление на поддержку поддержки разделов по архитектуре.

Самый простой способ читает цифры один за другим, и добавить его в сумму сразу, или прочитать весь номер в виде строки, а затем добавить символы

Смежные вопросы