linux - linux 64 位汇编语言中的段错误(初学者)

标签 linux

在 linux 64 位汇编语言中获取段错误和输出不是所期望的。初学者。任何帮助,将不胜感激。在我与助教/教授交谈之前,先在这里寻求帮助。以下是该站点的链接以供引用: http://www.cs.fsu.edu/~langley/CIS4385-2014-1/Assign2-new.html

到目前为止,这是我的代码:

.text                           # Start of code segment

.global _start              # Declaring for linker (ld)

_start:
                            # String to stdout

      movl    $len,%edx           # Argument: message length
      movl    $msg,%ecx           # Argument: pointer to message to write
      movl    $1,%ebx             # Argument: file handle (stdout)
      movl    $4,%eax             # System call number (sys_write)
      syscall                     # Invokes system calls in Linux

      movl    $0,%ebx             # Argument: exit code
      movl    $1,%eax             # System call number (sys_exit)
      syscall                     # Invokes system calls in Linux

.data                           # Start of data segment

msg:
    .ascii    "Hello World (64 bit version) --- this is MY NAME!\n"
    .ascii    "\n"
    .ascii    "CIS 4385 Spring 2014\n"
    len = . - msg                 # length of string

最佳答案

您将 x86 汇编与 x86_64 汇编混淆了。

  1. 寄存器名称不同。 %edx vs %rdx, %ebx vs %rdi, ... 你需要阅读 x86_64 约定.这不是从 %e..%r.. 的简单替换!
    另外,如果你只是写 mov $1,%rax,那么 GNU as(1) 会为你选择一个合适的 mov 变体(movq 在这种情况下)
  2. 系统调用号不同。例如,SYS_write1。有关完整列表,请参阅 /usr/include/asm/unistd_64.h

仅供引用,这是使用 GDB 的方法:

$ gdb -tui ./your.exe -ex 'break _start' -ex run
(gdb) layout next
(gdb) (hit Enter, Enter... until you get a desired view)
(gdb) nexti # or stepi, if you want to go into a function call
(gdb) (hit Enter, Enter, ...)

关于linux - linux 64 位汇编语言中的段错误(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976340/

相关文章:

linux - Bash 提取某些标签之间的所有行

c - delwin(stdscr) 合法吗?

linux - 如何在 Linux 上不使用 ps 命令获取所有进程 ID

Java `DisplayMode` 在 Linux 上的位深度是 `-1`

linux - pthread_kill() 在使用 nptl 库时出现段错误

linux - 文件重命名(将文件名的1部分转移到文件名的 'beginning')

c++ 这个参数在命令行中是什么意思? | grep MATCH >zout匹配

linux - apache 无法读取文档根目录中的 755 文件夹

c - 需要在 linux C 中获取星期六的日期

c - 如何按某种顺序运行 fork 进程?