Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers c语言中的指针转换为汇编语言_Pointers_Assembly - Fatal编程技术网

Pointers c语言中的指针转换为汇编语言

Pointers c语言中的指针转换为汇编语言,pointers,assembly,Pointers,Assembly,根据我的理解,下面的代码表示将指针存储在%rsi中%eax如果正确,则第二行表示将%eax中的指针添加到%rdi中的指针 非常困惑。我知道汇编没有指针,我只是把汇编翻译成c。我必须把汇编代码写成c代码,这两行代码让我很痛苦。我可以澄清一下吗 movl (%rsi), %eax addl %eax, (%rdi) 由于您似乎正在使用AT&T语法,因此括号将取消引用%rsi中的值。这些表达式的C等价物为: /* Expression 1 */ unsigned int* p = som

根据我的理解,下面的代码表示将指针存储在
%rsi
%eax
如果正确,则第二行表示将
%eax
中的指针添加到
%rdi
中的指针

非常困惑。我知道汇编没有指针,我只是把汇编翻译成c。我必须把汇编代码写成c代码,这两行代码让我很痛苦。我可以澄清一下吗

movl    (%rsi), %eax
addl    %eax, (%rdi)

由于您似乎正在使用AT&T语法,因此括号将取消引用
%rsi
中的值。这些表达式的C等价物为:

/* Expression 1 */
unsigned int* p = some_address;
unsigned int i = *p; /* *p dereferences the address in p */


/* Expression 2 */
unsigned int* p = some_address;
unsigned int i = 8;
i += *p /* Increase i by the value pointed to by p */

第一行不存储指针,而是取消对它的引用。你也可以说它是从一个地址加载的。第二行是(非原子)读-修改-写,其中
eax
的值被添加到
rdi
指向的对象中。因此,与其将
%rsi
的内存空间复制到
%eax
中,不如将
%rsi
的内容移动到
%eax
?我刚才说过两次同样的话,但我的意思是在指针的上下文中,看到那些括号了吗?这意味着
(%寄存器)
是内存中的地址
movl(%rsi),%eax
与“将
%rsi
移动到
%eax
”有很大不同,最接近的等价物是
movq%rsi、%rax
movl%esi、%eax
。您的问题的标题是否向后?似乎你想知道如何将汇编语言翻译成C语言,而不是C语言翻译成汇编语言。顺便说一句,我问的问题不是。这个问题基于对汇编代码的思考,因为它与c中的指针有关。
8
来自哪里?
i
不应该只有它从第一个表达式得到的值吗?@EOF对此表示抱歉。我更像是个情报员person@Barmar
8
只是一个示例值。我打算将这两个表达式作为单独的例子来处理,因为它基本上是
*rdi+=*rsi
。取rsi的内存地址中的内容,复制内容,然后将rsi中的内容添加到rdi的内存空间中,这正是@Barmar所说的
*rdi+=*rsi
,我也看到了,这是指向的吗(rdi)而不是rdi在这种情况下是严格的学术性的。你根本不需要这样做。只是练习一下。@Levi@EOF