在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程序集混淆。
寄存器名不同。%edx%rdx%ebx%rdi。。。您需要阅读有关x86_64约定的内容。从%e..%r..并不是一个简单的替换!
另外,如果您只是编写mov $1,%rax,那么GNUas(1)将为您选择一个合适的mov变体(在本例中为movq
系统调用号码不同。例如,SYS_write就是1。完整列表请参见/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位汇编语言(Beginner)中的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21976340/

10-11 22:49
查看更多