gpt4 book ai didi

linux - 对 X86_64 linux : Why should we write mov [digit], al 的程序集中标签的使用感到困惑,但不是 mov digit, al?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:22 26 4
gpt4 key购买 nike

这是我的代码:

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 之间的区别有疑问。

我了解到标签(如代码中的digit)代表数据的内存地址,运算符“[]”的作用类似于取消引用指针,因此它将加载标签指向目的地的值。

例如,mov rax, [digit] 会将 0 抛出到 rax 寄存器,因为 digit 指向数据的第一个元素(在本例中为整数 0)。

但是,在我的代码中,当我写 mov [digit], al 时它起作用了,这意味着“将存储在 al 中的值加载到内存地址 digit”,但我不知道为什么在这种情况下我们应该使用“[]”。 mov 的第一个参数必须是目标(如寄存器或内存地址),所以我认为它应该是 mov digit, al 而不是 mov [数字], al.我不明白为什么我们使用一个值从另一个地方获取值而不是使用内存地址获取值。

这就是我的全部问题。请给我任何关于我的想法错误的地方或对我的标签概念的任何纠正。

最佳答案

在 NASM 语法中(有使用不同符号的汇编程序,例如 MASM/TASM use a different flavor of Intel syntax ,而 gas 使用 AT&T syntax )以下 x86 指令......

mov esi, someAddress
mov esi, [someAddress]
mov [someAddress], esi
mov someAddress, esi ; see below

...(将)具有以下含义:

mov esi, someAddress

将表示someAddress 存储地址的数字写入寄存器esi。因此,如果 someAddress 存储在地址 1234,则值 1234 将写入 esi

mov esi, [someAddress]

将内存的内容写入esi。因此,如果 someAddress 存储在地址 1234 并且存储在地址 1234 的值是 5678,则将值 5678 写入 esi

你也可以说:变量 someAddress 的值(一个变量通常只是内存中某个地址的内容)被写入 esi注册。

mov [someAddress], esi

esi的内容写入内存地址someAddress

你也可以说:将esi的值写入变量someAddress

mov someAddress, esi

的意思是:将代表地址someAddress的常量数更改为esi

因此,如果 someAddress 位于地址 1234 并且 esi 包含值 5678,则指令将意味着:

以 1234 = 5678 的方式更改数学常数 1234。

这当然很愚蠢,因为数学常数 1234 和 5678 永远不会相等。因此 x86 CPU 没有这样的指令。

(有些 CPU 有类似的指令。例如,在 SPARC CPU 上,如果您只想让指令的一侧有一个值给零寄存器的指令(这意味着:“给常量零赋值”)效果 - 就像设置标志 - 但你对结果本身不感兴趣。)

关于linux - 对 X86_64 linux : Why should we write mov [digit], al 的程序集中标签的使用感到困惑,但不是 mov digit, al?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com