«Hello, World» во FreeBSD 11.2 с использованием nasm - PullRequest
0 голосов
/ 05 февраля 2019

В сборке я не могу отобразить текст.Этот ASM-код прямо из книги (низкоуровневое программирование Игоря Жиркова).Я не могу отобразить текст в приглашении оболочки, но программа прекрасно собирается, а затем успешно связывается с ld.

global _start

section .data
message: db 'hello, world!', 10

section .text
_start:
  mov rax, 1
  mov rdi, 1

  mov rsi, message
  mov rdx, 14
  syscall

исходный код asm, "hello world"

1 Ответ

0 голосов
/ 06 февраля 2019

Попробуйте этот пример (протестировано на FreeBSD 12 )

Сохраните это в hello.s:

section .data

message:
    db      'hello, world!', 10

section .text

global _start
_start:
    mov     rax, 4
    mov     rdi, 1
    mov     rsi, message
    mov     rdx, 14
    syscall

    mov     rax, 1
    xor     rdi, rdi
    syscall

Установите nasm:

# pkg install nasm

Теперь выполните сборку с:

$ nasm -f elf64 hello.s

Это создаст файл hello.o, который вы свяжете с помощью ld :

$ ld -m elf_amd64_fbsd -o hello -s hello.o

Это должно создать файл с именем hello:

$ ./hello
hello, world!

Если вы просто попробуете:

$ ld -o hello -s hello.o

После попытки запустить его вы можете получить эту ошибку:

ELF binary type "0" not known.
./hello: Exec format error. Binary file not executable.

Проверьте этот пост (elf_i386_fbsd) , а также этот ответ для дальнейшего использования.

Чтобы исправить вставленный код, замените:

mov rax, 1

с

mov rax, 4

в противном случае, похоже, просто для выхода.

Вы можете найти эти системные вызовы числа в /usr/include/sys/syscall.h, дляпример:

/*
 * System call numbers.
 *
 * DO NOT EDIT-- this file is automatically generated.
 * $FreeBSD: stable/12/sys/sys/syscall.h 339002 2018-09-28 17:25:28Z jhb $
 */

#define SYS_syscall     0
#define SYS_exit        1
#define SYS_fork        2
#define SYS_read        3
#define SYS_write       4
#define SYS_open        5
#define SYS_close       6
#define SYS_wait4       7
                                /* 8 is old creat */
#define SYS_link        9
#define SYS_unlink      10
                                /* 11 is obsolete execv */
#define SYS_chdir       12
#define SYS_fchdir      13
#define SYS_freebsd11_mknod     14
#define SYS_chmod       15
#define SYS_chown       16
#define SYS_break       17
...