为什么x86_64程序集要执行" / bin / bash"段错误?

时间:2013-01-26 22:38:44

标签: assembly x86 x86-64 disassembly

我一直在重新学习并编写一些汇编代码,这对初学者来说非常基本。我正在x86_64上运行Ubuntu,但我跟随的教程是在32位x86上完成的。

我已经包含了下面的短装配程序,它可以组装和链接,但在运行时会出现段错误。我打赌我的错误是关于32位和64位指令与内存使用之间的界限的混淆/混淆。例如,我在所有movq寄存器(我收集的32位寄存器的x86_64版本)上使用r**指令 - 但可能是错误的。

如果有人能够在这里解释问题,我真的很感激,我觉得如果我更好地了解原因,它将来真的有助于避免这些类型的问题。

 .data
Bash:
    .asciz "/bin/bash"
Null1:
    .int 0
AddrToBash:
    .int 0
Null2:
    .int 0

.text
.globl _start

_start:
movq $Bash, AddrToBash
movq $59, %rax
movq $Bash, %rbx
movq $AddrToBash, %rcx
movq $Null2, %rdx
syscall 

Exit:
movq $60, %rbx
movq $1, %rax
syscall

提前致谢!

1 个答案:

答案 0 :(得分:3)

  1. Syscall参数位于%rsi%rdi%rdx。见What are the calling conventions for UNIX & Linux system calls on x86-64
  2. .int 0太短,在所有三个地方都应该.quad 0