NASM x64读取数字到数组并写出

时间:2017-01-10 13:03:41

标签: linux assembly nasm x86-64 system-calls

从键盘到数组读取10个数字然后将它们写出来我遇到了一个大问题。

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

1 个答案:

答案 0 :(得分:0)

关于输入和数据结构。

循环读取每个字符(angular .module('tessicommunicationApp') .factory( 'AuthServerProvider', function loginService($http, localStorageService, $window, $state, $cookies) { return { login : function(credentials) { var data = 'j_username=' + encodeURIComponent(credentials.username) + '&j_password=' + encodeURIComponent(credentials.password) + '&remember-me=' + credentials.rememberMe + '&submit=Login'; return $http .post( 'api/authentication', data, { headers : { 'Content-Type' : 'application/x-www-form-urlencoded' } }).success(function(response) { return response; }); }, )。输入字符将是例如rdx=1,字符'1', '2', '3', '4', '5', 10是新行(也可以检查其他空格字符,如10,或者甚至可以翻转测试,{{1}中的任何字符1}}范围是数字的结尾)。

在读取数字时,决定是将它们存储为字符串还是数字。

如果是字符串,则将每个新数字写入地址arr + n * 8 + input_char_index的内存中,在数字后面可能将零值作为终止符放置(当前数组最多可容纳7个字符长字符串+ 0表示每个“n” “),或者将字符串长度存储到单独的数组中,或者作为元素的第一个字节存储,并使第一个字符串在长度字节之后等于+1偏移量...(您可以根据需要设计数据结构)。要显示这样的字符串,只需加载它的地址13, 9, 32并用'0'..'9'计算它的长度(它读取+按char计算char,直到找到lea rcx,[arr+n*8]),或加载长度(如果已存储)某处,并且sys_write它。

如果要存储数字,请在输入之前将一些备用寄存器设置为零(例如strlen),然后对于每个数字读取,请0 rdi =>那是add rdi,rdi,然后将输入字符从ASCII数字转换为64b 0-9值,并将其添加到lea rdi,[rdi+rdi*4] ...循环,直到读取非数字或换行符(但64b无符号数将溢出为19+位输入)。在输入结束后,将值存储到rdi *= 10,现在rdi将包含数字QWORD值。

要输出它们,你必须在相反的方向进行转换,从数值到一些内存缓冲区,产生数字ASCII字符(具有足够大的缓冲区,再次20+字符对于64b值是安全的)。将您的号码存储在内存中作为ASCII字符串+知道它的长度后,您可以将它SYS_WRITE到stdout。

您还可以考虑先学习一些教程,然后重新阅读一些有关常见数据结构/等,内存,字符串编码,寄存器,x86寻址模式的理论,....在编写自己的代码之前(因为感觉对我而言,你猜得太多了,事情是如何运作的。)