Метка вызова NASM не вызывается - PullRequest
0 голосов
/ 04 июля 2018

Я пишу ассемблер с помощью NASM в Linux, но столкнулся с проблемой.

global _start

section .text

testFunctionName:
    mov rdi, 12
    ret

_start:

    call testFunctionName

    mov rax, 1
    mov rbx, 0
    int 0x80

и собраны и связаны

nasm -felf64 -F dwarf -g program.asm -o program.o
ld program.o -o program

testFunctionName никогда не используется. Я подтвердил это с помощью GDB. Я не могу найти ответ нигде в Интернете. Если кто-то может объяснить, что происходит и как это исправить, Буду признателен за это

1 Ответ

0 голосов
/ 04 июля 2018

Вы, вероятно, используете nexti или next, что делает более вызовами, а не на них.

Установите точку останова на mov rdi, 12 внутри вашей функции или на один шаг на вызовы, используя stepi (или si для краткости).

Или, если вы не доверяете GDB, напишите программу, состояние выхода которой зависит от того, выполняется функция или нет.

testFunctionName:
    mov  ebx, 12
    ret

_start:
    xor   ebx, ebx   ; ebx=0

    call testFunctionName

    mov   eax, 1
    int   0x80       ; sys_exit(ebx), 32-bit ABI

Запустите это и echo $?, чтобы увидеть, что состояние выхода равно 12, а не 0, потому что функция выполняет , если не работает ваш ЦП, не работает NASM или компоновщик.


Вы также можете поместить недопустимую инструкцию в вашу тестовую функцию, например ud2. Или программная точка останова: int3. Или делить на ноль. Что-то, что вызовет исключение вместо того, чтобы позволить вашему процессу сделать системный вызов выхода. Тогда вы точно заметите, называется он или нет.


См. Также Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде? Чтобы сделать собственный 64-битный системный вызов exit (0) таким же образом, как у glibc _exit() Функция делает,

    xor   edi, edi     ; rdi=0
    mov   eax, 231     ; __NR_exit_group   from <asm/unistd_64.h>
    syscall            ; sys_exit_group(edi)
...