这里是我的代码:对于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是地址。这是一个数字。 –