2016-09-08 5 views
0

Я пытаюсь распечатать функцию out put W - X) + (Y - Z), я держу , получая ошибку сегментации (сбрасывать ядра), когда когда-либо компилирую и пытаюсь запустить программафункция печати (получить ошибку сегментации)

NASM -felf64 asm_program -o asm_program.o

НКУ -m64 asm_program.o -o asm_program

./asm_program

я искал вокруг, но я не могу оштрафовать решение. Сначала я хотел спросить, что означает эта ошибка сегментации и как она относится к моей программе, во-вторых, где я ошибаюсь в своем коде.

относительно новым для сборки, кстати

Программа начинается здесь

global main 

extern printf 

segment .data 

    w: DQ 1 
    x: DQ 3 
    y: DQ 5 
    z: DQ 2 



    segment .text 

    main: 

    call compute 


    compute: 

    mov rax, w 
    mov rcx, x 
    add rax,rcx 

    mov rbx, y 
    mov rbp, z 
    add rbx, rbp 

    mul rbx 
    call printf 
+0

Всегда заканчивайте свои программы на 'ret' :) –

ответ

0

Ваша формула (w-x) + (y-z) противоречит коду в принципе, который обозначает (w + x) * (y + z), поэтому я приведу вам пример.

mov rax, w Move the address of w into RAX which is 0x601038 
mov rax, [w] Moves the value @ 0x601038 which is 1. 

Результат, который мы ищем, - 28, так что это будет трюк.

global main 

extern printf 
    segment .rodata 
Fmt  db 13, 10, 9, 'Result is %d', 13, 10, 13, 10, 0 

    segment .data 
    w: DQ 1 
    x: DQ 3 
    y: DQ 5 
    z: DQ 2 

    segment .text 
main: 

    call compute 
    ret  ; added, or computed is executed a second time 

compute: 
    mov  rax, [w] 
    add  rax, [x] 
    mov  rcx, rax 

    mov  rax, [y] 
    add  rax, [z] 
    xor  rdx, rdx 
    mul  rcx 

    mov rdi, Fmt  ; Format string 
    mov rsi, rax  ; Value to be displayed 
    call printf 
    ret    ; added or program continues executing in the bush 

Существует много способов кожи этого кота, это просто пример, который работает.

+0

спасибо, что было очень полезно – William

1

Bigger проблема: вы никогда не называйте ret:

global main 

extern printf 

segment .data 

    w: DQ 1 
    x: DQ 3 
    y: DQ 5 
    z: DQ 2 



    segment .text 

    main: 

    call compute 
    ret  ; added, or computed is executed a second time 

    compute: 

    mov rax, w 
    mov rcx, x 
    add rax,rcx 

    mov rbx, y 
    mov rbp, z 
    add rbx, rbp 

    mul rbx 
    call printf 
    ret  ; added or program continues executing in the bush 

После этого, мы должны были бы см. API printf, чтобы убедиться, что он вызван с надлежащими параметрами (регистры или стек правильно инициализируется). Если это printf, я знаю, это переменная функция args, которая нуждается в таком формате, как "%d", а затем аргумент. Я не видел никакого формата в вашем коде.

Чтобы напечатать простое целое число, я бы избегал использовать printf и выводил бы символ результата символом после использования пользовательского целочисленного => строкового кода. Это сделает ваш код более компактным и более независимым (сборка не выполняется для вызова функций C все время :)).

+0

Я добавил в ret и до сих пор получаю ошибку – William

+0

, вам нужно использовать отладчик, чтобы посмотреть, что происходит. Каковы аргументы 'printf'? это регистр или стек? удалите вызов 'printf'' и посмотрите, не прекратится ли он. –

+0

Я удалил вызов, теперь он компилируется, но не печатает ответ после его запуска. Что касается аргументов для printf, я думаю, что я ошибочно использовал его, когда писал еще одну программу до того, как вам понадобилась функция вызова – William

 Смежные вопросы

  • Нет связанных вопросов^_^