我想在gcc上测试内联asm capabilty.因此,我在64位的ubuntu 12.04上键入并编译以下代码,但系统在运行时会在屏幕上显示"分段错误".我不知道导致问题的原因.
#include <stdio.h>
char Format[]="Hello world %d\n";
int main()
{
asm
(
"movl $3,4(%esp);"
"movl $Format,(%esp);"
"call printf;"
);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢你们帮我一个程序新手.我使用Code :: blocks作为IDE来编写此代码.我曾尝试使用像%rdx这样的64位寄存器,但编译代码时Build消息的日志显示"Error:bad register name`%rdx'".我认为这意味着Code :: blocks调用的gcc是32位版本,因此无法识别这些寄存器.我修改代码以保留堆栈空间
#include <stdio.h>
char Format[]="Hello world %d\n";
int main()
{
asm
(
"subl $8,%esp;" //I don't know $4, $8, $12, $16, $20 which is correct
//but I had tried them all but results are still ''segmentation fault."
"movl $3,4(%esp);"
"movl $Format,(%esp);"
"call printf;"
"movl %ebp,%esp;"
);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
甚至使用-m32作为编译器选项,但它仍然显示"分段错误". …
namespace ConsoleApplication4
{
class T1
{
public int MyProperty { get; set; }
}
class Program
{
static void Main(string[] args)
{
var tmp = (new[] { 1, 3, 4 }).Select(x =>new T1 { MyProperty=x});
foreach (var s in tmp)
{
s.MyProperty = 9;
}
foreach (var s in tmp)
{
Console.WriteLine(s.MyProperty);
}
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我预计屏幕上有三个9,但值仍然相同.
但是,如果我稍微修改代码,则值将成功更改,即:
var tmp = (new[] { 1, 3, 4 }).Select(x =>new T1 { MyProperty=x}).ToList();
Run Code Online (Sandbox Code Playgroud)
我想知道为什么?