需要帮助在linux mint

时间:2016-03-01 21:55:46

标签: linux assembly x86

我是汇编编程的新手,我在PC上运行汇编程序时遇到了困难。我不太了解运行程序的过程。我正在做的是尝试运行一个" HELLO WORLD"计划如下。

     #include <asm/unistd.h>
     #include <syscall.h>
     #define STDOUT 1
     .data
     hello:
             .ascii  "hello world\n"
     helloend:
     .text
     .globl _start
     _start:
             movl    $(SYS_write),%eax // SYS_write = 4
             movl    $(STDOUT),%ebx    // fd 
             movl    $hello,%ecx       // buf 
             movl    $(helloend-hello),%edx   // count
             int     $0x80

             movl    $(SYS_exit),%eax
             xorl    %ebx,%ebx
             int     $0x80
             ret

很抱歉没有添加评论,因为我自己并不了解大部分内容。我只是想在我的电脑上设置环境,以便我可以学习装配。

要运行上面的代码,我首先将文件保存为&#34; hello.S&#34;。 然后打开当前目录中的终端,运行以下命令:

     /lib/cpp hello.S hello.s
     as -o hello.o hello.s //to generate an object file named hello.o
     ld hello.o
     ./a.out

但是在运行可执行文件后,我没有按预期看到结果。我的意思是该程序应打印出来&#34; hello world&#34;,但我不会得到任何结果或任何错误消息。我知道该程序是正确的。因此,我的系统或运行程序的方式一定存在问题。

为什么在运行可执行文件a.out后没有得到任何结果?

1 个答案:

答案 0 :(得分:0)

通常情况下,让gcc进行繁重的提升&#34;。另请注意,如果您使用64位Linux并尝试组装和运行32位代码,则可能需要提供-m32以生成32位代码。

无论如何,我拿了你的代码,编译并运行如下:

linux:~/scratch> cat hello.S
     #include <asm/unistd.h>
     #include <syscall.h>
     #define STDOUT 1
     .data
     hello:
             .ascii  "hello world\n"
     helloend:
     .text
     .globl _start
     _start:
             movl    $(SYS_write),%eax // SYS_write = 4
             movl    $(STDOUT),%ebx    // fd 
             movl    $hello,%ecx       // buf 
             movl    $(helloend-hello),%edx   // count
             int     $0x80

             movl    $(SYS_exit),%eax
             xorl    %ebx,%ebx
             int     $0x80
             ret
linux:~/scratch> gcc -m32 -nostartfiles -nodefaultlibs hello.S 
linux:~/scratch> ./a.out 
hello world
linux:~/scratch>