Получение возвращаемого значения syscall в сборке - PullRequest
1 голос
/ 04 апреля 2020

Я пишу простую программу сборки на Darwin x86_64 (MacOS 10.14.6), которая создает файл (test.txt) и записывает в него букву «E». Однако по какой-то причине буква «Е» не записывается в файл. Что я делаю не так?

Вот моя программа:

global start
section .text
    start:
        ;Create the file
        mov rax, 0x2000005
        mov rdi, fname
        mov rsi, 0x200
        mov rdx, 0o644
        syscall

        ;Write to file
        mov rdi, rax     ;As far as I know, this uses the fd returned by creating a file (previous syscall)
        mov rsi, msg
        mov rdx, 1
        mov rax, 0x2000004
        syscall

        ;Exit
        mov rax, 0x2000001
        mov rdi, 0
        syscall
section .data
    msg: db "E"     ;Message
    fname: db "test.txt"     ;File name

Я также попробовал это:

global start
section .text
    start:
        mov rax, 0x2000005
        mov rdi, fname
        mov rsi, 0x200
        mov rdx, 0o644
        syscall
        mov rdi, rax
        mov rsi, msg
        mov rdx, 2
        mov rax, 0x2000004
        syscall
        mov rax, 0x2000001
        mov rdi, 0
        syscall
section .data
    msg: db "E", -1
    fname: db "test.txt", 0

Еще ни одна не работает.

1 Ответ

1 голос
/ 05 апреля 2020

Я нашел ответ:

Я обнаружил, что открытие файла в режиме создания и в режиме записи работает.

global start
section .text
    start:
        ;Open file with create mode and write mode
        mov rax, 0x2000005
        mov rdi, fname
        mov rsi, 0x201
        mov rdx, 0o644
        syscall

        ;Now write
        mov rdi, rax
        mov rsi, msg
        mov rdx, 1
        mov rax, 0x2000004
        syscall

        ;Exit
        mov rax, 0x2000001
        mov rdi, 0
        syscall
section .data
    msg: db "E"
    fname: db "test.txt"

Также здесь представлен массив флагов для открытия файлов:

O_ACCMODE: 0x3
O_APPEND: 0x8
O_ASYNC: 0x40
O_CLOEXEC: 0x1000000
O_CREAT: 0x200
O_DIRECTORY: 0x100000
O_DSYNC: 0x400000
O_EXCL: 0x800
O_EXLOCK: 0x20
O_NDELAY: 0x4
O_NOCTTY: 0x20000
O_NOFOLLOW: 0x100
O_NONBLOCK: 0x4
O_RDONLY: 0x0
O_RDWR: 0x2
O_SHLOCK: 0x10
O_SYNC: 0x80
O_TRUNC: 0x400
O_WRONLY: 0x1

Для объединения используйте оператор | (в C) или or (в сборке).

...