无法在程序集中找到String的长度(nasm Linux)

时间:2016-02-06 16:39:26

标签: assembly 64-bit nasm

我制作了一个程序,它将一个字符串作为用户的输入,然后计算它的长度并显示它。但是当我运行程序时,我收到错误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

我可以保证我的其他程序是正确的。错误将出现在代码的上述部分。什么可能是错误?

1 个答案:

答案 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等问题。