как передать переменную по ссылке на c функцию `sscanf ()` - PullRequest
0 голосов
/ 29 апреля 2020

следующий код пытается прочитать аргументы командной строки, а затем сканирует их с помощью sscanf() и использует результат для вывода текста utf8.

Я не могу вызвать sscanf() и получаю ошибку segfault в строка, где я вызываю эту функцию

Я уже отладил это, и я знаю, в чем проблема, но не знаю, как ее решить.

            global  main
            extern  puts
            extern  sscanf
            extern  printf
            extern  emit_utf_8

            section .text
main:

                        cmp rdi, 2
                        jl  argumentsError

                        add     rsi, 8                  ; skip the name of the program
forloop:
                        mov     r12, rsi
                        push    rdi                     
                        push    rsi
                        push    r12                     
                        sub     rsp, 8                  ; must align stack before call
                        ; start of for bloc

                        xor rax, rax
                        mov     rdi, qword [r12]              
                        mov     rsi, codePointFormat 
                        mov     rdx, qword [codePoint]
                        call    sscanf
                        cmp     rax, 1
                        je      ifthen
                        jmp     else
ifthen:
                        mov     rdi, codePoint
                        call    emit_utf_8
                        jmp     endif
else:
                        mov     rdi, incorrectFormat
                        mov     rsi, r12
                        call    printf
endif:                                          


                        ; end of for bloc
                        add     rsp, 8                  ; restore %rsp to pre-aligned value
                        pop     r12
                        pop     rsi                     
                        pop     rdi

                        add     rsi, 8                  ; point to next argument
                        dec     rdi                     ; count down
                        jnz     forloop                 ; if not done counting keep going

                        ret

argumentsError:     mov rdi, argumentsRequiredMessage
                    call    puts

                    mov rdi, argumentDescription
                    call    puts

                    xor rax, rax
                    inc rax
                    ret

            section .data
argumentsRequiredMessage:
                         db "This program requires one or more command line arguments,", 0
argumentDescription:     db "one for each code point to encode as UTF-8.", 0
incorrectFormat:         db "(%s incorrect format)", 0
codePointFormat:         db "U+%6X", 0

            section .bss
codePoint:      resb    8           ; The code point from sscanf should go here.

Есть ли способ передать этот третий аргумент ?

sscanf() подпись.

in __cdecl sscanf(const char *const _buffer, const char *const _Format, ...)

Я использую Ubuntu 19.04 64 бит

...