在 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
vs%rdx
,%ebx
vs%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 位汇编语言中的段错误(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976340/