在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/