小编Chr*_*son的帖子

在版本控制中维护Visual Studio vcproj项目文件的建议

Microsoft Visual Studio使用XML来保存其.vcproj项目文件.因此,应该很容易区分XML项目文件.

不幸的是,如果您更改任何项目文件的属性,Visual Studio会坚持随机改组项目文件的XML节点!这使得项目文件更改的文本差异和合并基本上不可能.更改一个编译器设置可以使我的视觉差异工具认为我已经改变了文件中50%的行!我甚至尝试了一些XML diff工具,但它们只是显示了一个更加结构化的同样混乱的视图.

有没有人有任何建议.vcproj在源代码管理中维护文件?或者说服Visual Studio 重新排列.vcproj文件中的XML节点的方法?

(我还研究过使用像CMake这样的工具.vcproj从更加差异友好的文本文件生成文件,但CMake有自己的问题.)

version-control projects-and-solutions project visual-studio

12
推荐指数
1
解决办法
5366
查看次数

如何在GCC x86内联汇编中使用地址常量

GCC工具链默认使用AT&T汇编语法,但可通过该.intel_syntax指令获得对Intel语法的支持.

此外,AT和T以及英特尔语法都有a prefix和a noprefix版本,不同之处在于它们是否需要使用%sigil 为寄存器名称添加前缀.

根据存在的指令,地址常量的格式会发生变化.

我们考虑以下C代码

*(int *)0xdeadbeef = 0x1234;
Run Code Online (Sandbox Code Playgroud)

使用objdump -d,我们发现它被编译为以下汇编程序指令

movl $0x1234,0xdeadbeef
Run Code Online (Sandbox Code Playgroud)

由于没有涉及到寄存器,这对于正确的语法.att_syntax prefix.att_syntax noprefix,即.嵌入在C代码中,它们看起来像这样

__asm__(".att_syntax prefix");
__asm__("movl $0x1234,0xdeadbeef");

__asm__(".att_syntax noprefix");
__asm__("movl $0x1234,0xdeadbeef");
Run Code Online (Sandbox Code Playgroud)

您可以选择用括号括起地址常量,即.

__asm__("movl $0x1234,(0xdeadbeef)");
Run Code Online (Sandbox Code Playgroud)

也会奏效.

将sigil添加到普通地址常量时,代码将无法复制

__asm__("movl $0x1234,$0xdeadbeef"); // won't compile
Run Code Online (Sandbox Code Playgroud)

当用paranthesis围绕这个表达式时,编译器将发出错误的代码而不发出警告,即

__asm__("movl $0x1234,($0xdeadbeef)"); // doesn't warn, but doesn't work!
Run Code Online (Sandbox Code Playgroud)

这将错误地发出指令

movl $0x1234,0x0
Run Code Online (Sandbox Code Playgroud)

在Intel模式下,PTR如果可能存在歧义,则地址常量必须以段寄存器为前缀,以及操作数大小和标志.在我的机器上(采用Windows XP和当前MinGW和Cygwin GCC版本的英特尔双核笔记本电脑),ds默认使用该寄存器.

常量周围的方括号是可选的.如果省略了段寄存器,但是括号存在,也可以正确识别地址常量.但是,忽略寄存器会在我的系统上发出警告.

prefix模式中,段寄存器必须以前缀为前缀%,但仅使用括号仍然有效.这些是生成正确指令的不同方法:

__asm__(".intel_syntax noprefix");
__asm__("mov DWORD PTR ds:0xdeadbeef,0x1234");
__asm__("mov …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc inline-assembly

9
推荐指数
1
解决办法
7767
查看次数