2014-02-23 80 views
0

在linux 64位彙編語言中,獲得分段錯誤和輸出不符合要求。初學者。任何幫助,將不勝感激。在我與TA教授交談之前,先尋求幫助。這裏是鏈接到該網站以供參考: http://www.cs.fsu.edu/~langley/CIS4385-2014-1/Assign2-new.htmllinux 64位彙編語言中的分段錯誤(初學者)

這裏是我的代碼至今:

.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 

回答

3

你感到困惑與86 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, ...)