0

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

我在下面包含了简短的汇编程序,它可以很好地组装和链接,但是在运行时会出现段错误。我打赌我的错误是关于 32 位和 64 位指令之间的行和内存使用情况的一些混淆/混淆。例如,我movq在所有寄存器上使用指令r**(我收集到的 32 位寄存器的 x86_64 版本)——但这可能是错误的。

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

 .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

提前致谢!

4

1 回答 1

3
  1. 系统调用参数在%rsi, %rdi, %rdx. 请参阅x86-64 上 UNIX 和 Linux 系统调用的调用约定是什么
  2. .int 0太短了,应该.quad 0三个地方都有。
于 2013-01-26T22:55:38.380 回答