【发布时间】:2020-07-08 04:20:14
【问题描述】:
我在看一本教科书,里面有一个基于 C 代码编写 x86-64 汇编代码的练习
//Assume that the values of sp and dp are stored in registers %rdi and %rsi
int *sp;
char *dp;
*dp = (char) *sp;
答案是:
//first approach
movl (%rdi), %eax //Read 4 bytes
movb %al, (%rsi) //Store low-order byte
我可以理解,但只是想知道我们不能一开始就做一些简单的事情:
//second approach
movb (%rdi), %al //Read one bytes only rather than read all four bytes
movb %al, (%rsi) //Store low-order byte
与第一种方法相比,第二种方法不是更简洁明了吗?因为我们只关心%rdi 的低字节,而不关心它的高 3 字节。
【问题讨论】:
-
您需要在
%rdi中添加1 或3 个字节(取决于字节序)以获得指向*sp低位字节的指针。 -
@Barmar 假设机器是小端,那么为什么我们需要添加 1 个字节?默认情况下地址是第一个字节,不是吗?
-
您的方式可能会停止存储到加载转发器。
-
@Barmar:x86-64 是 little-endian。
int的低字节是最不重要的。 OP 的两个版本都是正确的,但第二个版本具有部分注册错误依赖项。 -
@slowjams 你所做的是将作业重写为
*dp = *(char*)sp;。教科书提供了原始 C 代码的直译,没有任何优化,以避免混淆读者。您的重写在功能上是等效的(假设指针不跨越页面边界),但有可能与您正在阅读的教科书章节范围之外的细微 CPU 性能问题发生冲突。
标签: c assembly x86-64 micro-optimization instructions