我制作了一个程序,它将一个字符串作为用户的输入,然后计算它的长度并显示它。但是当我运行程序时,我收到错误Segmentation fault (core dumped)
。我的代码如下所示
str_len: ;Procedure to calculate length of String
xor rdx,rdx
xor rcx,rcx ;I want to store length in rcx
mov rdx,[string] ;string contains the input taken from the user
mov rsi,rdx
mov rcx,'0' ;By default rcx will contain '0' decimal
up: cmp byte[rsi],0 ;Compare if end of string
je str_o ;If yes then jump to str_o
inc rcx ;Increment rcx i.e., length
inc rsi ;Point to next location of rdx i.e.,string
jmp up ;Repeat till end of string
str_o: mov rax,1 ;Print final length
mov rdi,1
mov rsi,rcx
mov rdx,1
syscall
ret
我可以保证我的其他程序是正确的。错误将出现在代码的上述部分。什么可能是错误?
答案 0 :(得分:2)
错误在于:
mov rdx,[string] ; string contains the input taken from the user
您正在使用字符串内容的前8个字节加载RDX,而不是字符串的地址。所以最好使用
lea rdx, string ; LEA = Load Effective Address
另一个问题是您的输出例程尝试使用
打印未转换为ASCII的数字mov rax,1 ; SYS_WRITE - Print final length
mov rdi,1 ; STDOUT handle
mov rsi,rcx ; RSI should point to buffer
mov rdx,1 ; length of buffer - a value of one prints only one char
syscall
这不起作用。您必须先将RCX中的qword编号转换为ASCII字符串,然后在RSI中传递此字符串的地址。搜索Stack Overflow以查找this等问题。