2017-01-10 18 views
0

У меня есть большая проблема с чтением 10 чисел с клавиатуры на массив и последующим их написанием.NASM x64 считывает числа в массив и выписывает

mov rcx, arr + qword [n]*8 - Я не знаю, как правильно его изменить, потому что на самом деле это вызывает ошибку. Кроме того, как мне установить mov rdx, 1, когда я хочу читать числа вроде: 12 123 1234 не только цифры?

Я был бы признателен за любую помощь.

global main 

section .text 

main: 
mov rbp, rsp; for correct debugging 
mov rdi, 0 
_in: 


mov rax, 3 
mov rbx, 0 
mov rcx, arr + rdi*8 
mov rdx, 1 
int 80h 


mov rax, 3 
mov rbx, 0 
mov rcx, blank 
mov rdx, 1 
int 80h 

inc qword [n] 
cmp qword [n], 10 
jz _next 
jmp _in 
inc rdi 

_next: 
mov qword [n], 0 
mov rdi, 0 
_out: 
mov rax, 4 
mov rbx, 1 
mov rcx, arr + rdi*8 
mov rdx, 1 
int 80h 

mov rax, 4 
mov rbx, 1 
mov rcx, nl 
mov rdx, 1 
int 80h 

inc qword [n] 
cmp qword [n], 10 
jz _end 
jmp _out 
inc rdi 
_end: 

mov rax, 1 
mov rbx, 0 
ret 

section .data 

arr times 10 dq 0 
blank db 0 
n dq 0 
nl db 10 
+0

Вам нужно загрузить 'n' в регистр, если вы хотите его индексировать. Остальная часть вашего вопроса неясна. – Jester

+0

извините за неясность, но английский не мой родной язык. Я имею в виду, когда я изменяю mov rdx, 2 я могу читать числа с клавиатуры, например 11, когда я изменяю mov rdx, 3 Я могу читать числа, подобные 111. Я хочу прочитать все возможные длины чисел. –

+0

Прочитайте их в цикле по цифре? – Jester

ответ

0

Сведения о структуре ввода и данных.

Продолжайте чтение на каждый символ (rdx=1), в цикле. Входными символами будут, например, '1', '2', '3', '4', '5', 10, символ 10 - это новая строка (возможно, проверьте также и другие пробельные символы, например 13, 9, 32, или даже переверните тест, любой символ из диапазона '0'..'9' - это конец номера).

При чтении цифр, решите, хотите ли вы сохранить их как строки или числа.

Если строки, то записывают каждую новую цифру в память по адресу arr + n * 8 + input_char_index, поместив, вероятно, нулевое значение в качестве терминатора после номера (ваш текущий массив может содержать не более 7 символов длинных строк + ноль для каждого " n ") или сохранить длину строки в отдельный массив или в качестве первого байта элемента и сделать первый символ в смещении +1 после байта длины и т. д. (вы можете спроектировать свою структуру данных, как вы пожелаете). Чтобы отобразить такую ​​строку, просто загрузите ее адрес lea rcx,[arr+n*8] и вычислите ее длину с помощью strlen (она будет считывать + счет char по char до тех пор, пока не будет найден 0) или загрузите длину, если вы ее где-то сохранили, и sys_write.

Если вы хотите сохранить номера, установить некоторые запасной регистр в качестве нулевого упреждающего ввода (например rdi), то для каждого значного чтения делать add rdi,rdilea rdi,[rdi+rdi*4] => это rdi *= 10, а затем преобразовать входной символ из ASCII цифры до 64b- -9 и добавьте его в rdi ... цикл до тех пор, пока не будет прочитана цифра или новая строка (но число без знака 64b будет переполняться для ввода 19 + цифр). После окончания ввода введите значение arr, теперь arr будет содержать числовые значения QWORD.

Для вывода их вы должны сделать преобразование в противоположном направлении, от численного значения в некоторый буфер памяти, производя цифру по символам ASCII (достаточно большой буфер, снова 20+ символов безопасны для значения 64b). После того, как ваш номер хранится в памяти в виде строки ASCII +, знайте, что это длина, вы можете SYS_WRITE на stdout.

Вы также можете рассмотреть несколько дополнительных руководств и перечитать некоторую теорию об общих структурах данных/etc, памяти, строковых кодировках, регистрах, режимах адресации x86, ... прежде чем писать свой собственный код (так как он чувствует, что вы слишком много догадываетесь, как все работает).

+0

Огромное спасибо, вы мне очень помогли, чтобы лучше понять это. Теперь моя программа работает отлично. –