小编Net*_* Wu的帖子

在gcc上的内联asm中使用printf函数

我想在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是3​​2位版本,因此无法识别这些寄存器.我修改代码以保留堆栈空间

#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作为编译器选项,但它仍然显示"分段错误". …

c assembly gcc inline-assembly segmentation-fault

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

无法为LINQ选择的数据分配新值

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)

我想知道为什么?

c# linq foreach select

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

标签 统计

assembly ×1

c ×1

c# ×1

foreach ×1

gcc ×1

inline-assembly ×1

linq ×1

segmentation-fault ×1

select ×1