Не могу понять ошибку носа. Как исправить код. - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь вызвать функцию printf из кода asm.

hello.asm:

%macro exit 0
    mov eax, 1
    mov ebx, 0
    int 80h
%endmacro

extern   printf      ; the C function, to be called

SECTION .data
    hello:     db   'Hello world!', 0

SECTION .text
    GLOBAL main

main:
    sub 8, rsp
    push dword hello
    call printf      ; Call C function
    add 8, rsp
    exit

Makefile:

all:
    nasm -f elf64 hello.asm -o hello.o
    ld hello.o -e main -o hello -lc -I/lib/ld-linux.so.2

clean:
    rm -f hello.o hello

сделать звонок:

nasm -f elf64 hello.asm -o hello.o
hello.asm:16: error: invalid combination of opcode and operands
hello.asm:19: error: invalid combination of opcode and operands
make: *** [all] Error 1

Пожалуйста, объясните ошибки и как исправить код.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Рабочий раствор:

hello.c:

extern exit      ; the C function, to be called
extern puts      ; the C function, to be called

SECTION .data
    hello:     db   'Hello world!', 0

SECTION .text
    GLOBAL _start

_start:
    mov edi, hello
    call puts      ; Call C function
    mov edi, 0
    call exit      ; Call C function

Makefile:

all:
    nasm -f elf64 hello.asm -o hello.o
    gcc -nostartfiles -no-pie hello.o -o hello

clean:
    rm -f hello.o hello
0 голосов
/ 01 сентября 2018

Оба сообщения об ошибках дают хорошие подсказки. Они происходят в строках 16 и 19.

В строке 16 у вас есть:

sub 8, rsp

Проблема здесь в том, что вы не можете вычесть (что-либо) из буквальной константы. Я думаю, что фактическое намерение было

sub rsp, 8

Аналогично для строки 19. Вместо

add 8, rsp

что вы хотите

add rsp, 8

Учтите, что для таких инструкций, как sub и add, первый операнд получает результат операции. И буквальные константы не могут этого сделать!

...