Assembly 用于取消对字符指针的引用并返回结果的汇编指令
我的CS书中的一个练习要求为一个函数提供一个简短的(x86-64)汇编代码段,该函数将char指针作为参数并返回它所指向的(第一个)字符 书中提出的解决方案如下:Assembly 用于取消对字符指针的引用并返回结果的汇编指令,assembly,x86,x86-64,att,Assembly,X86,X86 64,Att,我的CS书中的一个练习要求为一个函数提供一个简短的(x86-64)汇编代码段,该函数将char指针作为参数并返回它所指向的(第一个)字符 书中提出的解决方案如下: movq (%rdi), %rax movb (%rax), %al 我本以为一个指示就足够了: movb (%rdi), %al 两者是否相等?我遗漏了什么?在您的第一个代码段中,出现了两个指针取消引用: movq (%rdi), %rax movb (%rax), %al 也就是说,rdi指向的8字节内存位置被加载到rax中
movq (%rdi), %rax
movb (%rax), %al
我本以为一个指示就足够了:
movb (%rdi), %al
两者是否相等?我遗漏了什么?在您的第一个代码段中,出现了两个指针取消引用:
movq (%rdi), %rax
movb (%rax), %al
也就是说,rdi
指向的8字节内存位置被加载到rax
中。然后,将rax
指向的1字节内存位置加载到al
中。您可以将其视为完全取消对指向char
(即char**
)的指针的引用
而在第二个代码段中,
movb(%rdi),%al
,存在一个单指针解引用,即,rdi
指向的1字节位置加载到al
。你可以把它看作是对一个指向char
(即char*
)的指针的解引用。第一个指针进行两次解引用,就像你有一个双指针一样。这是哪本书,所以被同一本书中的相同错误所迷惑的未来读者可以更容易地找到它?哦,所以它不是char*
arg.:或者它通过引用,而你忘了提到这一点。不知道如何解决这个误导性的问题。可能包括书中的实际措辞,然后答案可以纠正你对它的解释为char*
。依我看,这要糟糕得多;你的新头衔没有那么具体。人们搜索和浏览问题标题时,不会知道问题是关于什么指令序列的。在问题主体中,“除其他外”并没有修改arg被声明为char指针的事实,我想我们还是把它留下吧。既然事实证明这不是一本书中的错误,那么来源就不那么重要了,我们不妨把它留下。有了这个特定的标题和一个有用的答案,也许它会有一些用处。