我试图打印出一个功能输出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
答案 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
有很多方法可以为这只猫提供皮肤,这只是一个有效的例子。