打印功能(获取分段错误)

时间:2016-09-08 21:56:25

标签: assembly segmentation-fault nasm x86-64 intel

我试图打印出一个功能输出W - X)+(Y - Z),我保持 在编译时得到分段错误(核心转储) 并尝试运行该程序

nasm -felf64 asm_program -o asm_program.o

gcc -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

2 个答案:

答案 0 :(得分:1)

更大的问题是:你永远不会打电话给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

之后,我们需要查看printf的API,以确保使用适当的参数(寄存器或堆栈正确初始化)调用它。如果这是我所知道的printf,那么它是一个变量args函数,需要一个像"%d"那样的格式然后参数。我没有在你的代码中看到任何格式。

要打印一个简单的整数,我会避免使用printf并在使用自定义整数=>后逐个字符地输出结果字符串代码。它会使你的代码更小,更独立(不会一直调用C函数进行汇编:)。

答案 1 :(得分:0)

您的公式(wx)+(yz)与原则上的代码冲突,表示(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

有很多方法可以为这只猫提供皮肤,这只是一个有效的例子。