這裏是我的代碼:對於X86_64 linux組裝中標籤的使用感到困惑:爲什麼我們應該寫mov [digit],al,而不是mov digit,al?
section .data
digit db 0,10
section .text
global _start
_start:
call _printRAXDigit
mov rax, 60
mov rdx, 0
syscall
_printRAXDigit:
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 2
syscall
ret
我有一個關於[digit]
和digit
之間的差異問題。
我已經瞭解到,標籤(如代碼中的數字)表示數據的內存地址,操作符「[]」的作用就像取消引用指針的東西,因此它會加載值標籤指向目的地。
例如,mov rax, [digit]
將在數據的第一個元素扔0到rax
寄存器,因爲數字點(在此情況下,整數0)。
然而,在我的代碼,它工作時,我寫mov [digit], al
,這意味着「加載存儲在al
到內存地址位價值」,但我不知道爲什麼我們要在此用「[]」案件。 mov
的第一個參數必須是目的地(如寄存器或內存地址),所以我認爲它應該是mov digit, al
而不是mov [digit], al
。對於我來說,爲什麼我們使用一個值從另一個地方獲取值,而不是使用內存地址來獲取值。
這就是我所有的問題。請給我任何迴應,關於我的思維錯誤或對標籤概念的任何更正。
'digit' *是*地址。但它也是一個數字。你需要告訴彙編器如何解釋它。 –
你是什麼意思,「數字是一個地址,但它也是一個數字。」,你可以給任何具體的例子,以便我可以更多地瞭解,謝謝 –
0是一個地址。這是一個數字。 3是地址。這是一個數字。 27是地址。這是一個數字。 252是地址。這是一個數字。 –