2014-01-08 29 views
2

我在x64程序集中製作了一個程序,使用AT & T語法,但我不明白mov運算符爲什麼要拷貝地址變量來註冊。這裏是我的代碼:爲什麼在x64程序集中移動拷貝變量地址來註冊?

 .globl main 

     .text 
main: 
    mov $a, %rax 

    mov  $format, %rdi   # set 1st parameter (format) 
    mov  %rax, %rsi    # set 2nd parameter (current_number) 
    mov  $0, %rax    # because printf is varargs 

    sub  $8, %rsp    # align stack pointer 
    call printf     # printf(format, sum/count) 
    add  $8, %rsp    # restore stack pointer 

    ret 

     .data 
a:  .quad 123 
format: .asciz "%d\n" 

該程序輸出6295616而不是123.請幫我理解我做錯了什麼。

+0

你想'移動[$ a],%rax'。地址處的值,而不是地址。 –

+0

我以前試過,但是我得到:「錯誤:無效字符'['開始操作數1'[$ a]'」。 – ssergiuss

回答

0

因爲你已經用美元符號表示你想要立即模式。刪除它以獲得絕對模式。

+0

當我刪除美元符號時,出現以下錯誤:「錯誤:無效字符'['開始操作數1 [a]'」。我也試着編寫「$ [a]」,但結果與「$ a」相同。 – ssergiuss

+0

您的原始代碼不包含任何括號。 –

+0

謝謝Jens!它使用簡單的變量名稱「a」,沒有美元符號。 – ssergiuss