Как изменить значение errno в asm x64 - PullRequest
0 голосов
/ 27 мая 2020

Я пишу сборку для школьного проекта, и я застрял в какой-то точке, мне нужно переписать чтение в asm, так что я понял, но мне нужно установить переменную errno, тогда мое чтение может вернуть -1 в случае ошибки и установите значение errno, например, на 9. И я не нашел, как изменить эту знаменитую ошибку :( это мой фактический код:

global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    mov rax, -1
    ret

ps: я нашел где-то, что мне нужно использовать __error, но я не нашел никаких документов по этому поводу: (

большое спасибо: D

edit:

Спасибо за вашу помощь, ребята! __Errno_location work Я делаю это:

extern __ernno_location
global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    neg rax    ; get absolute value of syscall return
    mov rdi, rax
    call __ernno_location
    mov [rax], rdi  ; set the value of errno
    mov rax, -1
    ret

1 Ответ

5 голосов
/ 27 мая 2020

Это непростое дело. Вам нужно найти определение errno в вашей системе. Он может проходить через вспомогательную функцию, например

/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())

, поэтому вы можете вызвать эту функцию из своей сборки, а затем установить значение с помощью возвращенного указателя. Более переносимым способом было бы написать вспомогательную функцию в C, например:

#include <errno.h>
void set_errno(int value)
{
    errno = value;
}

, которая позаботится о материалах, зависящих от платформы.

...