取消引用 char 指针和 return 结果的汇编指令
Assembly instruction to dereference a char pointer and return the result
我的 CS 书中的一个练习要求一个函数的简短 (x86-64) 汇编片段,该函数将 char 指针作为参数,returns 它指向的(第一个)字符。
书中提出的解决方案如下:
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 *
)。
我的 CS 书中的一个练习要求一个函数的简短 (x86-64) 汇编片段,该函数将 char 指针作为参数,returns 它指向的(第一个)字符。
书中提出的解决方案如下:
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 *
)。