以下是我拥有的代码片段(部分显示):
q = strrchr(resolved, '/'); /* given /home/misha/docs.txt, q now pts to the last slash */
if (q != NULL) {
p = q + 1; /* p points to docs.txt */
if (q == resolved)
q = "/";
else {
do {
--q;
} while (q > resolved && *q == '/');
使用 objdump 生成带有 -S 标志的输出:
401789: e8 7a fb ff ff call 401308 <strrchr>
40178e: 48 89 45 d0 mov QWORD PTR [rbp-0x30],rax
if (q != NULL) {
401792: 48 83 7d d0 00 cmp QWORD PTR [rbp-0x30],0x0
401797: 0f 84 12 01 00 00 je 4018af <fb_realpath+0x22d>
p = q + 1; /* p points to docs.txt */
40179d: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
4017a1: 48 83 c0 01 add rax,0x1
4017a5: 48 89 45 d8 mov QWORD PTR [rbp-0x28],rax
if (q == resolved)
4017a9: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
4017ad: 48 3b 85 e0 fe ff ff cmp rax,QWORD PTR [rbp-0x120]
4017b4: 75 0a jne 4017c0 <fb_realpath+0x13e>
q = "/";
4017b6: 48 c7 45 d0 c5 20 40 mov QWORD PTR [rbp-0x30],0x4020c5
4017bd: 00
4017be: eb 33 jmp 4017f3 <fb_realpath+0x171>
else {
do {
--q;
4017c0: 48 83 6d d0 01 sub QWORD PTR [rbp-0x30],0x1
} while (q > resolved && *q == '/');
4017c5: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
4017c9: 48 3b 85 e0 fe ff ff cmp rax,QWORD PTR [rbp-0x120]
4017d0: 76 0b jbe 4017dd <fb_realpath+0x15b>
4017d2: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
4017d6: 0f b6 00 movzx eax,BYTE PTR [rax]
4017d9: 3c 2f cmp al,0x2f
4017db: 74 e3 je 4017c0 <fb_realpath+0x13e>
现在,我有一个关于q = "/";
教学的问题。q
被定义为 achar*
并且从这个例子中可以看出,它包含一个由strrchr
fucntion返回的值。然后它被分配给一个字符串 -q = "/";
在代码中进一步。现在,代表汇编的指令是 - mov QWORD PTR [rbp-0x30],0x4020c5
。我很难理解这个指令。现在,我的理解是,它应该将字符串“/”移动到q
. 但是它怎么知道指向的位置q
呢?即rbp-0x30
是堆栈上q
存储的位置。这个位置应该包含q
指向的对象的地址。但是,我将其解释mov QWORD PTR [rbp-0x30],0x4020c5
为将字符串移动0x4020c5
到rbp-0x30
即的地址q
. 这就是我感到困惑的地方,因为该位置应该包含地址而不是字符串。
感谢您的阅读,感谢您的帮助。