- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这个“strcpy”函数的目的是将src的内容复制到dest,结果很好:显示两行“Hello_src”。
#include <stdio.h>
static inline char * strcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__("1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
: "0"(src),"1"(dest)
: "memory");
return dest;
}
int main(void) {
char src_main[] = "Hello_src";
char dest_main[] = "Hello_des";
strcpy(dest_main, src_main);
puts(src_main);
puts(dest_main);
return 0;
}
我尝试将行 : "0"(src),"1"(dest)
更改为 : "S"(src),"D"(dest )
,发生错误:'asm' 操作数具有不可能的约束
。我就是无法理解。我认为这里的“0”/“1”指定了与第0/1个输出变量相同的约束。第 0 个输出的约束是 =&S
,第 1 个输出的约束是 =&D
。如果我改成0-->S,1-->D,应该不会有错。这是怎么回事?
“clobbered registers”或 earlyclobber 操作数 (&) 有什么用吗?我尝试去掉“&”或“memory”,这两种情况的结果都和原来的一样:输出两行“Hello_src”字符串。那么我为什么要使用“破坏”的东西呢?
最佳答案
earlyclobber &
意味着特定的输出是在输入被消耗之前写入的。因此,编译器可能不会将任何输入分配给同一寄存器。显然,使用 0
/1
样式会覆盖该行为。
当然,clobber 列表也有重要的用途。编译器不解析您的汇编代码。它需要 clobber 列表来确定您的代码将修改哪些寄存器。你最好不要说谎,否则可能会出现细微的错误。如果你想看到它的效果,请尝试欺骗编译器在你的 asm block 周围使用寄存器:
extern int foo();
int bar()
{
int x = foo();
asm("nop" ::: "eax");
return x;
}
生成的汇编代码相关部分:
call foo
movl %eax, %edx
nop
movl %edx, %eax
注意编译器如何必须将 foo
的返回值保存到 edx
中,因为它相信 eax
将被修改。通常它会把它留在 eax
中,因为那是以后需要它的地方。在这里你可以想象如果你的 asm 代码在没有告诉编译器的情况下修改了 eax
会发生什么:返回值将被覆盖。
关于c - gcc : ‘asm’ operand has impossible constraints 中的扩展 asm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26191261/
更新:请注意,我不是在问什么是盐、什么是彩虹表、什么是字典攻击或盐的目的是什么。我想问:如果你知道用户的salt和hash,是不是很容易算出他们的密码? 我理解这个过程,并在我的一些项目中自己实现它。
我的 Android 应用程序中有一些固有的异步代码。我正在使用 RxJava2。 Thing 类不在我的控制之下(但 ThingFactory 可以)。在一种方法 (createThing()) 中
一个相当聪明的人告诉我,你不能在 C 中实现垃圾收集,因为它是弱类型的。基本思想似乎是 C 给了你太多的自由。他提到在没有类型检查的情况下转换指针... 我不太理解这个想法。有人可以给我一个解释,并可
Type-Driven Development with Idris礼物: twoPlusTwoNotFive : 2 + 2 = 5 -> Void twoPlusTwoNotFive Refl i
数学类型如何以可搜索的格式表示,如文本? 我的意思是有一个工具栏,您可以输入数学符号并将它们作为文本进行搜索,因此该格式可以将数学符号表示为文本。 因为数学类型只能用图标表示,所以这样的任务是不可能实
#include int main(void){ asm volatile("ldi r16, %0\n\t" "out %1, r16\n\t"
我想做一个平均值:问题是我正在计算每个元素的 AVG 的 1 个项目(工作)但是一旦我想要类别平均值的 GLOBAL 平均值(something and foo) 它不起作用(mysql 向我抛出一个
我的程序似乎遇到了一个非常难以重现的错误:难得一见,当用户将他的 Mac 置于休眠状态,然后再次将其唤醒时,我程序的一个子进程将崩溃Mac 唤醒后立即。 发生这种情况时,Apple 的崩溃报告机制会可
如果您已经编程了一段时间,那么您可能会注意到时不时会发生一些完全不可能发生的事情,您确信对此没有可能的解释(“这是一个编译器错误!!”)。在你找出它是由什么引起的之后,虽然你就像“哦哦”。 嗯,这只是
我正在使用 DownloadManager 从网络服务下载文件。下载成功结束,但是当我尝试打开“下载”文件夹中的新文件时,出现“无法打开文件”错误(我知道我可以打开这种类型的文件)。 此外,当我将手机
偶尔我会遇到这样的情况,我写了一些代码,但根据它的逻辑,某条路径是不可能的。例如: activeGames = [10, 20, 30] limit = 4 def getBestActiveGame
因此,我一直致力于将 Chip-8 仿真器作为我的 CompSci 类(class)的期末项目,并且遇到了一个似乎超出我的代码范围的问题。我下载的大量演示(我确信它们是真正的 Chip-8 程序,而不
因此,我一直致力于将 Chip-8 仿真器作为我的 CompSci 类(class)的期末项目,并且遇到了一个似乎超出我的代码范围的问题。我下载的大量演示(我确信它们是真正的 Chip-8 程序,而不
我的应用程序的一部分通过互联网在两个设备之间传输序列化对象数据,并在另一端反序列化(通过使用 Kryo 库)。 Proguard 混淆了这些类的名称,但我现在意识到我应该不混淆序列化类,以便应用程序的
我正在尝试做一些可能不可能用运算符重载来做的事情。我对重载赋值运算符特别感兴趣,它会接收另一种数据类型 值作为其右手值。它应该看起来像这样: MyClass myclass = "hello worl
我试图在 Java 上实现 Miller-Rabin 素数测试,并将其计算时间与 BigInteger 类的 native 素数测试进行比较。鉴于我在这里,您可能已经猜到我的代码不起作用。问题是,我得
我从 Linux 下的汇编程序开始。我已将以下代码保存为 testasm.c 并编译它:gcc testasm.c -ostasm 编译器回复:“'asm' 中不可能的约束”。 #include i
我在做一个VUE项目。。Reaction也是如此。。DevServer{代理:...在webpack设置中...当应用}时,代理设置适用于在npmi安装的库。。但,。Const脚本=createEle
如何在 AS3 中保留内容(图形、添加的显示对象等)的同时复制显示对象( Sprite 、影片剪辑等)? Kirupa (http://www.kirupa.com/forum/showpost.ph
我制作了一些应用程序来构建一个巨大的 FlowDocument。构建 FlowDocument 所用的时间约为 3~4 秒。 所以我喜欢在 BackgroundWorker 中构建 FlowDocum
我是一名优秀的程序员,十分优秀!